pushState и SEO
многие люди говорят, используйте pushState, а не hashbang.
то, что я не понимаю, как бы Вы были дружественны к поисковой системе без использования hashbang?
предположительно ваш контент pushState генерируется клиентским кодом JavaScript.
сценарий выглядит так:
Я example.com
. Мой пользователь нажимает ссылку:href="example.com/blog"
pushState захватывает щелчок, обновляет URL-адрес, захватывает файл JSON откуда-то и создает список сообщений в блоге в области содержимого.
С hashbangs, google знает, чтобы перейти к escaped_fragment URL, чтобы получить их статическое содержимое.
С pushState Google просто ничего не видит, поскольку он не может использовать код JavaScript для загрузки JSON и последующего создания шаблона.
единственный способ сделать это, который я вижу, - это отобразить шаблон на стороне сервера, но это полностью отрицает преимущества нажатия слоя приложения на клиент.
Итак, я правильно понимаю, pushState не является SEO дружественным для клиентских приложений вообще?
3 ответов
Как насчет использования мета-тега, который Google предлагает для тех, кто не хочет хэш-челки в своих URL-адресах:
<meta name="fragment" content="!">
см. здесь для получения дополнительной информации: https://developers.google.com/webmasters/ajax-crawling/docs/getting-started
к сожалению, я не думаю, что NickC прояснил проблему,которую я думал, что у OP. Проблема просто в том, что мы не знаем, кому мы служим, если мы не используем хэш-Банг. Pushstate не решит это США. Мы не хотим, чтобы поисковые системы говорили конечным пользователям переходить к некоторому URL, который выплевывает неформатированный JSON. Вместо этого мы создаем URL-адреса (которые вызывают другие вызовы других URL-адресов), которые извлекают данные через AJAX и представляют их пользователю так, как мы предпочитаем. Если пользователь не является человеком, то в качестве альтернативы мы можем использовать HTML-снимок, чтобы поисковые системы могли правильно направлять пользователей на URL-адрес, по которому они ожидали бы найти запрошенные данные (и презентабельно). Но конечная задача - как определить тип пользователя? Да мы можем использовать .htaccess или что-то переписать URL для поисковых ботов мы обнаруживаем, но я не уверен, насколько это fullproof и futureproof. Также возможно, что Google может наказывать людей за такие вещи, но я не исследовал это полностью. Таким образом, комбо (pushstate + мета-тег google) кажется вероятным решением.
Is pushState
плохо, если вам нужны поисковые системы, чтобы читать ваш контент?
нет, разговор о pushState
ориентирован на выполнение того же общего процесса для hashbangs, но с более красивыми URL-адресами. Подумайте о том, что на самом деле происходит, когда вы используете hashbangs...
вы говорите:
С hashbangs, Google знает, чтобы перейти к escaped_fragment URL, чтобы получить их статическое содержимое.
так в других слова,
- Google видит ссылку на
example.com/#!/blog
- запросы Google
example.com/?_escaped_fragment_=/blog
- вы верните снимок содержимого, которое пользователь должен увидеть
как вы можете видеть, он уже полагается на сервер. если вы не обслуживаете снимок содержимого с сервера, то ваш сайт не индексируется должным образом.
Итак, как Google увидит что-нибудь с pushState?
С pushState google просто ничего не видит, поскольку он не может использовать javascript для загрузки json и последующего создания шаблона.
на самом деле, Google увидит все, что он может запросить в site.com/blog
. URL-адрес по-прежнему указывает на ресурс на сервере, и клиенты по-прежнему подчиняются этому контракту. Конечно, для современных клиентов Javascript открыл новые возможности для извлечения и взаимодействия с контентом без страница обновить, но контракты такие же.
Итак, предполагаемая элегантность pushState
Это то, что он обслуживает один и тот же контент для всех пользователей, старых и новых, JS-способных и нет, но новых пользователей получить расширенные возможности.
как вы заставляете Google видеть ваш контент?
подход Facebook-обслуживать тот же контент по URL
site.com/blog
что ваше клиентское приложение превратится в, когда вы нажмете/blog
на государство. (Facebook не используетpushState
еще что я знаю, но они делают это с hashbangs)подход Twitter-перенаправить все входящие URL-адреса на эквивалент hashbang. Другими словами, ссылка на" / blog " толкает
/blog
на государство. Но если он запрашивается напрямую, браузер заканчивается на#!/blog
. (Для Googlebot это будет маршрут к_escaped_fragment_
как вы хотите. Для других клиентов, вы могли быpushState
вернуться к довольно URL-адрес).
так что вы теряете _escaped_fragment_
возможности pushState
?
в нескольких разных комментариях вы сказали
экранированный фрагмент совершенно другой. Вы можете обслуживать чистое содержимое, кэшированное содержимое и не загружаться под нагрузкой обычных страниц.
идеальным решением для Google является либо сделать сайты JavaScript, либо реализовать какой-то способ узнать, что есть URL-адрес экранированного фрагмента даже для сайтов pushstate (роботов.txt?).
преимущества, которые вы упомянули, не изолированы от _escaped_fragment_
. Что он делает переписывание для вас и использует специально названный GET
param-это действительно деталь реализации. Нет ничего особенного в этом, что вы не могли бы сделать со стандартными URL - адресами-другими словами, переписать /blog
to /?content=/blog
С помощью и mod_rewrite или эквивалент вашего сервера.
что делать, если вы не служите серверный контент вообще?
если вы не можете переписать URL-адреса и служить какой-то контент at /blog
(или любое состояние, которое вы нажали в браузере), тогда ваш сервер действительно больше не соблюдает контракт HTTP.
это важно, потому что перезагрузка страницы (по какой-либо причине) будет вытягивать контент по этому URL-адресу. (см. https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review- " view-source и перезагрузка будут получать содержимое в новом URI, если его толкнули.")
дело не в том, что рисование пользовательских интерфейсов один раз на стороне клиента и загрузка контента через JS APIs-плохая цель, просто она на самом деле не учитывается с HTTP и URL-адресами, и она в основном не обратно совместима.
на данный момент это именно то, для чего предназначены hashbangs - для представления различных состояний страницы, которые перемещаются на клиенте, а не на сервере. Ля перезагрузка, например, загрузит то же самое ресурс, который затем может читать, анализировать и обрабатывать хэшированное значение.
так случилось, что у них есть также используется (в частности Facebook и Twitter), чтобы изменить историю на стороне сервера без обновления страницы. именно в этих случаях использования люди рекомендуют отказаться от hashbangs для pushState.
если вы визуализируете все содержимое на стороне клиента, вы должны подумайте о pushState
как часть более удобного API истории, а не выход из использования hashbangs.
все интересные разговоры о pushState и #!
, и я все еще не вижу, как pushState заменяет #!'s цель, как спрашивает оригинальный плакат.
наше решение, чтобы сделать наш сайт/приложение Ajax на основе 99% JavaScript SEOable использует #!
конечно. Поскольку рендеринг клиента выполняется через HTML, JavaScript и PHP, мы используем следующую логику в загрузчике, контролируемом нашей страницей. HTML-файлы полностью отделены от JavaScript и PHP, потому что мы хотим тот же HTML в обоих (по большей части). JavaScript и PHP делают в основном то же самое, но PHP-код менее сложный, так как JavaScript намного богаче пользовательского опыта.
JavaScript использует jQuery для ввода в HTML содержимого, которое он хочет. PHP использует PHPQuery для ввода в HTML содержимого, которое он хочет - используя "почти" ту же логику, но намного проще, поскольку версия PHP будет использоваться только для отображения SEOable версии с SEOable ссылками и не будет взаимодействовать с JavaScript версия.
все три компонента, которые составляют страницы, страницы.htm, page.js и Пейдж.php существует для всего, что использует экранированный фрагмент, чтобы знать, загружать ли версию PHP вместо версии JavaScript. Версия PHP не должна существовать для не-SEOable контента (например, страницы, которые можно увидеть только после входа пользователя). Все просто.
Я все еще озадачен тем, как некоторые разработчики front end уходят от разработки отличных сайтов (с богатством Google Docs) без использования серверных технологий в сочетании с браузерными... Если JavaScript даже не включен, то наше решение 99% JavaScript, конечно, ничего не будет делать без PHP на месте.
можно иметь хороший URL, чтобы приземлиться на странице, обслуживаемой PHP, и перенаправить на версию JavaScript, если JavaScript включен, но это не хорошо с точки зрения пользователя, поскольку пользователи являются более важной аудиторией.
на боковой ноте. Если вы делаете просто простой веб-сайт, который может функционировать без JavaScript, тогда я вижу, что pushState полезен, если вы хотите постепенно улучшить свой пользовательский опыт от простого статически отображаемого контента до чего-то лучшего, но если вы хотите дать своему пользователю лучший опыт от go get... скажем, ваша последняя игра, написанная на JavaScript или что-то вроде Google Docs, тогда ее использование для этого решения несколько ограничивает, так как изящно отступать можно только до тех пор, пока пользователь переживание болезненно по сравнению с видением места.