Часто задаваемые вопросы об AJAX

Когда нужно использовать элементы _escaped_fragment_ и #! в URL AJAX?

На сайте необходимо использовать синтаксис #! во всех URL, где применяется схема сканирования AJAX. Робот Googlebot не переходит по ссылкам, в которых используется формат _escaped_fragment_.

Где можно ознакомиться с принципами работы AJAX?

Пример приложения AJAX приведен на странице http://gwt.google.com/samples/Showcase/Showcase.html. Если нажать на одну из ссылок слева, в URL будет включен хеш-фрагмент #!, позволяющий переводить приложение в состояние, которое соответствует этому фрагменту. Если изменить элемент #! (пример URL: http://gwt.google.com/samples/Showcase/Showcase.html#!CwRadioButton) на ?_escaped_fragment_= (например, http://gwt.google.com/samples/Showcase/Showcase.html?_escaped_fragment_=CwRadioButton), сайт будет возвращать снимок HTML.

Почему нужно использовать элемент #! в URL ресурса AJAX?

Страницы без этого элемента могут некорректно отображаться в результатах поиска Google. Однако мы продолжаем работать над тем, чтобы работа робота Googlebot была больше похожа на работу браузера. Как только функции, необходимые для вашего сайта, будут реализованы, робот Googlebot сможет начать правильно вносить в индекс ваши страницы без дополнительной помощи. Однако такая схема сканирования AJAX предлагает решение этой проблемы для сайтов, на которых уже используется AJAX и для которых правильное индексирование содержания нужно обеспечить уже сейчас. Мы полагаем, что наше решение подойдет разработчикам, которые уже применяют снимки HTML-кода своих страниц или создают их с помощью консольного браузера.

Сколько снимков HTML нужно использовать?

Это зависит от того, как часто обновляется контент в вашем приложении. Если он обновляется часто, лучше формировать новый снимок HTML при обработке каждого запроса от поискового робота. С другой стороны, приложение может представлять собой архив библиотеки, материалы которой меняются редко. Чтобы серверу не приходилось постоянно создавать одни и те же снимки HTML, лучше сохранить их и в дальнейшем просто к ним обращаться. Можно также вернуть роботу Googlebot код статуса HTTP 304 (не изменен).

А если в моем приложении не используются хеш-фрагменты?

Попробуйте реализовать их. Использование хеш-фрагментов значительно повышает скорость работы приложения, поскольку они обрабатываются браузером на стороне клиента и дают возможность не обновлять всю страницу. Кроме того, хеш-фрагменты обеспечивают работу истории в приложении (пресловутая кнопка "Назад" в браузере). Их используют различные платформы AJAX. Например, это Really Simple History, плагин управления историей jQuery а также управление историей в Google Web Toolkit или в ASP.NET с помощью AJAX.

Если же реализовать хеш-фрагменты в приложении невозможно, используйте специальный токен в хеш-фрагменте (к нему относятся все символы после знака ## в URL). Хеш-фрагмент, который представляет уникальное состояние страницы, должен начинаться с восклицательного знака. Предположим, приложение AJAX содержит такой URL:

www.example.com/ajax.html#mystate

В результате должен получиться следующий вариант:

www.example.com/ajax.html#!mystate

Если сайт AJAX поддерживает эту схему, он будет считаться доступным для сканирования. Это означает, что поисковый робот увидит контент приложения, если сайт предоставит снимок HTML.

Не появится ли множество сложных URL с синтаксисом _escaped_fragment_?

Синтаксис _escaped_fragment_ используется для временных URL, которые не показываются конечным пользователям. Если же адрес можно увидеть, например в приложениях, в файлах Sitemaps, гиперссылках, при переадресации, это должен быть упрощенный URL (с обозначением #! вместо _escaped_fragment_). Именно такие адреса отображаются в результатах поиска.

Провоцирует ли технология AJAX использование маскировки?

Под маскировкой понимается показ разного содержания пользователям и поисковым системам. Обычно такой метод используется для недобросовестного повышения рейтинга сайтов. Мы не одобряем такую практику и не считаем, что для ее реализации допустимо применять AJAX Поэтому снимок HTML должен содержать тот же контент, который конечный пользователь увидит в браузере. В противном случае мы будем расценивать это как маскировку. Подробнее…

Поможет ли AJAX повысить индексируемостмоих файлов Flash и других мультимедийных объектов?

Google индексирует различные типы мультимедийных файлов, и наши технологии непрерывно совершенствуются. Но поисковые роботы не всегда могут отсканировать материалы Flash или аналогичные ресурсы, а также весь динамический контент на сайте. Используя описанные здесь технологии, вы помогаете роботу Googlebot обработать больше контента. Напоминаем, что снимок HTML должен совпадать с тем, что пользователь видит в браузере. Google оставляет за собой право исключать из индекса сайты, на которых используется маскировка.

Что если некоторые URL хеш-фрагментов на моем сайте сканировать не нужно?

Поисковый робот Google просканирует URL всех хеш-фрагментов, которые найдет на сайте, поддерживающем технологию AJAX. Если некоторые из этих URL сканировать не нужно, закройте к ним доступ с помощью файла robots.txt. Чтобы это проще было сделать, дайте всем таким фрагментам сходные названия. Предположим, все неиндексируемые фрагменты выглядят следующим образом: #DONOTCRAWLmyfragment. Чтобы робот Googlebot не сканировал эти страницы, добавьте в файл robots.txt следующую строку:

Disallow: /*_escaped_fragment_=DONOTCRAWL

Что, если элемент #! уже используется в хеш-фрагментах?

Элемент #! редко используется в хеш-фрагментах, однако он не запрещен спецификацией URL. Как быть, если #! уже есть в ваших URL и вы не хотите переходить на новый алгоритм работы с AJAX? В таком случае можно добавить в файл robots.txt команду для поискового робота:

Disallow: /*_escaped_fragment_

Предположим, приложение содержит только следующий URL: www.example.com/index.html#!mystate. В таком случае этот URL не будет сканироваться. Если же помимо этого адреса также используется обычный URL (www.example.com/ajax.html), он сканируется.

Поддерживает ли AJAX специальные возможности?

Поскольку поисковым системам доступен статический контент, пользователям с ограниченными возможностями удобно работать с сайтами. С помощью консольных браузеров владельцы сайтов могут автоматически создавать снимки кода HTML и затем предоставлять их программам для чтения с экрана. Поэтому поддерживать актуальность статического контента теперь намного легче, а приложения можно сделать более удобными для людей с ограниченными возможностями.

Как использовать атрибут rel="canonical"?

Правильно: <link rel="canonical" href="http://example.com/ajax.html#!foo=123" /> (неправильно: <link rel="canonical" href="http://example.com/ajax.html?_escaped_fragment_=foo=123" />).

Какой URL лучше использовать в файле Sitemap?

В файл Sitemap нужно включать ту версию, которая должна отображаться в результатах поиска, то есть http://example.com/ajax.html#!foo=123.

Как URL с элементом #! работают в фидах товаров?

Этот вопрос часто задают владельцы сайтов, на которых одни и те же URL используются в Google Покупках и веб-поиске. Как правило, версия URL с #! считается канонической и применяется во всех случаях, а версия с _escaped_fragment_ считается временной и не должна быть видна конечному пользователю.

Я использую HtmlUnit в качестве консольного браузера, но он не работает. Почему?

Если HtmlUnit не предоставляет снимок, вероятно он не успел выполнить код JavaScript и отправить запросы XHR. Чтобы решить эту проблему, попробуйте выполнить описанные ниже действия.

  • Используйте класс NicelyResynchronizingAJAXController. Это позволит HtmlUnit дождаться выполнения всех вызовов XHR.
  • Увеличьте время ожидания для элемента waitForBackgroundJavaScript и/или waitForBackgroundJavaScriptStartingBefore.

Если это не помогло решить проблему, изучите ответы на часто задаваемые вопросы об HtmlUnit на странице http://htmlunit.sourceforge.net/faq.html. На сайте HtmlUnit также есть форум для пользователей.