Используйте PushState и Precomposition
Текущий (2015) способ сделать это - использовать метод pushState в JavaScript.
PushState изменяет URL-адрес в верхней панели браузера без перезагрузки страницы. Скажем, у вас есть страница, содержащая вкладки. Вкладки скрывают и отображают содержимое, а содержимое вставляется динамически, либо с помощью AJAX, либо просто путем настройки display: none и display: block, чтобы скрыть и отобразить правильное содержимое вкладки.
При нажатии на вкладки используйте pushState, чтобы обновить URL-адрес в адресной строке. Когда страница отображается, используйте значение в адресной строке, чтобы определить, какую вкладку показывать. Угловая маршрутизация сделает это автоматически.
Precomposition
Существует два способа использования одностраничного приложения PushState (SPA).
- Через PushState, где пользователь нажимает ссылку PushState и содержимое AJAXed.
- Нажав на ссылку напрямую.
Первоначальное попадание на сайт будет заключаться в прямом обращении к URL. Последующие попадания будут просто AJAX в контенте, когда PushState обновляет URL.
Сканеры собирают ссылки со страницы, а затем добавляют их в очередь для последующей обработки. Это означает, что для сканера каждое попадание на сервер является прямым попаданием, они не перемещаются через Pushstate.
Предварительная композиция связывает начальную полезную нагрузку с первым ответом от сервера, возможно, как объект JSON. Это позволяет поисковой системе отображать страницу без выполнения вызова AJAX.
Есть основания полагать, что Google может не выполнять запросы AJAX. Подробнее об этом здесь:
https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo
Поисковики могут читать и выполнять JavaScript
Google уже некоторое время может анализировать JavaScript, поэтому они изначально разработали Chrome, чтобы выступать в качестве полнофункционального безголового браузера для паука Google. Если ссылка имеет действительный атрибут href, новый URL может быть проиндексирован. Больше нечего делать.
Если, кроме того, нажатие на ссылку вызывает вызов pushState, пользователь может перемещаться по сайту через PushState.
Поддержка поисковой системы для PushState URL
PushState в настоящее время поддерживается Google и Bing.
Google
Вот Мэтт Каттс, отвечающий на вопрос Пола Айриша о PushState для SEO:
http://youtu.be/yiAF9VdvRPw
Вот Google объявляет о полной поддержке JavaScript для паука:
http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html
В результате Google поддерживает PushState и будет индексировать URL-адреса PushState.
Смотрите также выбор инструментов Google для веб-мастеров как Googlebot. Вы увидите, что ваш JavaScript (включая Angular) выполнен.
Bing
Вот объявление Bing о поддержке красивых URL-адресов PushState от марта 2013 года:
http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/
Не используйте HashBangs #!
URL-адреса Hashbang были отвратительным временным промежутком, требующим от разработчика предоставить предварительно отрендеренную версию сайта в специальном месте. Они все еще работают, но вам не нужно их использовать.
URL-адреса Hashbang выглядят так:
domain.com/#!path/to/resource
Это будет в сочетании с метатегом, как это:
<meta name="fragment" content="!">
Google не будет индексировать их в этой форме, а вместо этого извлечет статическую версию сайта из URL-адреса _escaped_fragments_ и проиндексирует ее.
URL-адреса Pushstate выглядят как любой обычный URL:
domain.com/path/to/resource
Разница в том, что Angular обрабатывает их для вас, перехватывая изменения в document.location, связанные с ним в JavaScript.
Если вы хотите использовать PushState URL-адреса (и вы, вероятно, делаете это), удалите все старые URL-адреса и метатеги в стиле хэширования и просто включите режим HTML5 в своем блоке конфигурации.
Тестирование вашего сайта
Инструменты Google для веб-мастеров теперь содержат инструмент, который позволит вам извлекать URL-адрес как google и отображать JavaScript так, как это делает Google.
https://www.google.com/webmasters/tools/googlebot-fetch
Генерация PushState URL в Angular
Чтобы генерировать реальные URL-адреса в Angular, а не с префиксом #, установите режим HTML5 для вашего объекта $ locationProvider.
$locationProvider.html5Mode(true);
Сторона сервера
Поскольку вы используете реальные URL-адреса, вам необходимо убедиться, что ваш сервер отправляет один и тот же шаблон (плюс некоторый предварительно составленный контент) для всех действительных URL-адресов. Как это сделать, зависит от архитектуры вашего сервера.
Карта сайта
Ваше приложение может использовать необычные формы навигации, например, при наведении курсора или прокрутке. Чтобы гарантировать, что Google может управлять вашим приложением, я бы, вероятно, предложил создать карту сайта, простой список всех URL-адресов, на которые реагирует ваше приложение. Вы можете разместить его в расположении по умолчанию (/ sitemap или /sitemap.xml) или сообщить об этом Google, используя инструменты для веб-мастеров.
В любом случае, хорошая идея иметь карту сайта.
Поддержка браузера
Pushstate работает в IE10. В старых браузерах Angular автоматически использует URL-адреса в стиле хэширования.
Демо-страница
Следующее содержимое отображается с помощью pushstate URL с предкомпозицией:
http://html5.gingerhost.com/london
Как можно убедиться, по этой ссылке контент проиндексирован и отображается в Google.
Обслуживание кодов заголовка 404 и 301
Поскольку поисковая система всегда будет попадать на ваш сервер при каждом запросе, вы можете отправлять коды состояния заголовка со своего сервера и ожидать, что Google их увидит.