Є чи pushStateпогано , якщо вам потрібно пошукові системи , щоб прочитати зміст?
Ні, мова pushStateйде про те , щоб виконати той самий загальний процес для hashbangs, але з більш красивими URL-адресами. Подумайте, що насправді відбувається, коли ви використовуєте hashbangs ...
Ти кажеш:
За допомогою hashbangs Google знає, що потрібно перейти до URL-адреси escaped_fragment, щоб отримати їх статичний вміст.
Іншими словами,
- 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. (Для Googlebot це буде переадресовано _escaped_fragment_як завгодно. Для інших клієнтів ви можете pushStateповернутися до красивої URL-адреси)
То ви втрачаєте _escaped_fragment_здатність з pushState?
У декількох різних коментарях ви сказали
втік фрагмент зовсім інший. Ви можете обслуговувати чистий нетемізований вміст, кешований вміст, і не піддаватися навантаженню, яке звичайні сторінки.
Ідеальне рішення - Google може або створювати веб-сайти JavaScript, або впровадити якийсь спосіб дізнатися, що існує екранований фрагмент URL-адреси навіть для сайтів pushstate (robots.txt?).
Переваги, про які ви згадали, не відокремлені _escaped_fragment_. Те, що він робить переписування за вас і використовує спеціально названий GETпараметр, насправді є деталлю реалізації. Там немає нічого особливого про це , що ви не могли б зробити зі стандартними URL , - іншими словами, переписати /blogв /?content=/blogна свій власний , використовуючи mod_rewrite або вашого сервера еквівалентні.
Що робити, якщо ви взагалі не обслуговуєте вміст на стороні сервера?
Якщо ви не можете переписати URL - адреси і служать свого роду змістом в /blog(або якому б стані ви виштовхувати в браузері), то сервер не насправді більше не дотримується договору HTTP.
Це важливо, оскільки перезавантаження сторінки (з якоїсь причини) призведе до переміщення вмісту за цією URL-адресою. (Див. Https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review - "view-source і reload завантажуватимуть вміст у новому URI, якщо його було натиснуто.")
Справа не в тому, що малювати користувальницькі інтерфейси на стороні клієнта і завантажувати вміст за допомогою API JS - погана мета, це просто те, що це насправді не враховується за допомогою HTTP та URL-адрес, і це в основному не є зворотним.
На даний момент це саме те, для чого призначені hashbangs - для представлення різних станів сторінок, які переміщуються на клієнті, а не на сервері. Наприклад, перезавантаження завантажить той самий ресурс, який потім зможе прочитати, проаналізувати та обробити хеш-значення.
Буває так, що вони також використовувались (зокрема, Facebook та Twitter) для зміни історії на розташування на стороні сервера без оновлення сторінки. Саме в тих випадках використання люди рекомендують відмовитися від hashbangs для pushState.
Якщо ви робите весь вміст на стороні клієнта, вам слід думати про це pushStateяк про частину більш зручного API історії, а не про вихід із використання hashbangs.