Использовать Backbone Router для работы с Hashbang для индексации SEO-контента?

Мой SPA использует ссылку Backbone.js, который использует pushstate и хешированные URL-адреса в качестве резервного метода. Я намерен использовать рекомендацию Google по созданию веб-сайта AJAX. приложение доступно для сканирования. То есть я хочу проиндексировать свой сайт в статические файлы .html, сгенерированные PhantomJS, и доставить их в Google через URL :

mysite.com/?_escaped_fragment_=key=value.

Имейте в виду, что сайт не обслуживает статические страницы для конечных пользователей (он работает только с браузером с поддержкой Javascript). Если вы перейдете к mysite.com/some/url, файл .htaccess настроен так, чтобы всегда обслуживать mysite.com/index.php, и магистральный маршрутизатор будет считывать URL-адрес, чтобы отобразить контент, созданный JavaScript для этого URL-адреса.

Кроме того, чтобы Google проиндексировал весь мой сайт, я планирую создать карту сайта, которая будет представлять собой список URL-адреса hashbang. URL-адреса должны быть обработаны хэш-бангом, чтобы Google знал, что нужно индексировать сайт с помощью URL-адреса _escaped_fragment_key.

Тааак....

(1) Будет ли этот подход работать?

и

(2) Поскольку backbone.js не использует URL-адреса хэш-бангов, как я могу преобразовать URL-адрес хэш-банга в URL-адрес pushstate, когда пользователь переходит через Google?< /сильный>

ссылка: https://stackoverflow.com/a/6194427/1102215


person Gil Birman    schedule 17.12.2013    source источник


Ответы (2)


В итоге я наткнулся на реализацию, как я описал в своих вопросах. Так...

(1) Да, похоже, этот подход работает довольно хорошо. Единственным недостатком является то, что хотя приложение работает без хэш-бангов, мой файл sitemap.xml полон URL-адресов хэш-бангов. Это необходимо, чтобы предупредить Google о том, что он должен запрашивать URL-адрес _escaped_fragment_ при сканировании этих страниц. Поэтому, когда сайт появляется в результатах поиска Google, в URL-адресе есть хэш-банг, но это небольшая цена.

(2) Эта часть оказалась намного проще, чем я себе представлял. Для инициализации маршрутизатора Backbone.js потребовалась всего одна строка кода...

window.location.hash = window.location.hash.replace(/#!/, '#');

var AppRouter = Backbone.Router.extend({...

После того, как хеш-банг будет заменен просто хэшем, магистральный маршрутизатор автоматически удалит хэш для браузеров, поддерживающих pushState. Кроме того, эти два изменения состояния URL не сохраняются в истории браузера, поэтому, если пользователь нажимает кнопку «Назад», не возникает никаких странностей/неожиданных перенаправлений.

ОБНОВЛЕНИЕ: лучший подход

Оказывается, есть очень простой подход, который полностью избавляет от хеш-бангов. Через BromBone:

Если ваш сайт использует хэш-банги (#!) URL-адреса, Google просканирует ваш сайт, заменив #! с ?escaped_fragment=. Когда вы увидите ?escaped_fragment=, вы поймете, что запрос исходит от поискового робота. Если вы используете html5 pushState, вы смотрите на заголовок "UserAgent", чтобы определить, исходит ли запрос от бота.

Это модифицированная версия предложенных BromBone правил перезаписи .htaccess:

    RewriteEngine On
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_USER_AGENT} .*Googlebot.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*Bingbot.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*Baiduspider.* [OR]
    RewriteCond %{HTTP_USER_AGENT} .*iaskspider.*
    RewriteRule ^(.*)$ snapshot.php/$1 [L]
person Gil Birman    schedule 19.12.2013
comment
быстрый комментарий. Вы не можете с уверенностью сказать, что пользовательский агент будет иметь имя паука в строке UA. Они часто маскируются под строку UA обычного браузера, чтобы посмотреть, что произойдет. Такой подход поможет. Но для того, чтобы вы могли обслуживать «основной» контент сайта, вам необходимо, чтобы маршрут был отправлен на сервер, а маршрут не был отправлен на сервер, когда используется #. Меня беспокоит то, что это будет обслуживать только контент домашнего просмотра, а не какой-либо контент с глубокими ссылками. Имеет ли это смысл? - person Chris Love; 21.12.2013
comment
Крис, ты говоришь о RewriteRule? Фактическое правило перезаписи, которое я использую, это RewriteRule ^(.*)$ snapshot.php/$1 [L] ... Я обновил этот ответ, чтобы отразить это - person Gil Birman; 21.12.2013
comment
Кроме того, Google не будет искать URL-адрес с #. Все URL-адреса в карте сайта выглядят как URL-адреса pushState. - person Gil Birman; 21.12.2013

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

Я взял этот термин из газеты Gaurdian, http://vimeo.com/channels/smashingconf.

В браузере проверьте, режет ли браузер горчицу, вот мой скрипт для этого:

<script>

    if (!('querySelector' in document)
         || !('localStorage' in window)
         || !('addEventListener' in window)
        || !('matchMedia' in window)) {

        if (window.location.href.indexOf("#!") > 0) {
            window.location.href = window.location.href.replace("#!", "?_escaped_fragment_=");
        } else {
            if (window.location.href.indexOf("?_escaped_fragment_=") < 0) {
                window.location.href = window.location.href + "?_escaped_fragment_=";
            }
        }

    } else {

        if (window.location.href.indexOf("?_escaped_fragment_=") >= 0) {
            window.location.href = window.location.href.replace("?_escaped_fragment_=", "#!");
        }
    }

</script>

На сервере вам нужен какой-то механизм для проверки наличия строки запроса _escape_fragment_. Если он присутствует, вам необходимо обслуживать основной сайт. Основной сайт использует только простой CSS и практически не использует JavaScript. У меня есть библиотека SPAHelper для ASP.NET MVC, которую вы можете проверить, чтобы увидеть некоторые вещи, которые я реализую для этого, https://github.com/docluv/spahelper.

Реальная проблема заключается в том, что большинство веб-фреймворков на стороне сервера, таких как ASP.NET, PHP и т. д., не предназначены для поддержки единой системы просмотра для клиента и сервера. Итак, вы как бы застряли, поддерживая два представления для этого. Я снова написал около 10 страниц по этой теме для своей книги, которая должна быть готова где-то на следующей неделе.

person Chris Love    schedule 19.12.2013
comment
Крис, спасибо за ответ. В своем вопросе я написал, что нет версии сайта без JavaScript. IOW, старые браузеры SOL. Это сделано специально, потому что это приложение на основе карты. Кроме того, перенаправление на URL-адрес escaped_fragment лишает цели, потому что URL-адреса hashbang находятся в файле sitemap.xml и, следовательно, это URL-адреса, на которые Google отправит пользователя (когда сайт появится в результатах поиска Google). ). - person Gil Birman; 20.12.2013
comment
Если вы читаете рекомендации Google, документ требует, чтобы документ был сгенерирован на сервере, как классический сайт. Следовательно, почему вы используете переменную строки запроса escape-фрагмента. Вы должны предоставить основной сайт пауку, чтобы соответствовать критериям. #! фрагмент не отправляется на сервер, поэтому ?. Карта сайта должна иметь #! версии, паук знает, как преобразовать этот URL-адрес в версию строки запроса. - person Chris Love; 20.12.2013
comment
Я не оспариваю то, что вы только что сказали. Я хочу сказать, что выполнение перенаправления JavaScript из #! URL-адрес escaped_fragment URL-адрес - неправильный способ сделать это. Google будет автоматически искать URL escaped_fragment, когда увидит #!. Кроме того, редирект отправит ваших пользователей именно туда, куда их не следует отправлять, то есть на статическую html-страницу, предназначенную только для поисковых роботов. - person Gil Birman; 20.12.2013
comment
нет, я не думаю, что вы понимаете, что я сказал. Я решил воспользоваться необходимостью основного сайта для поисковой системы. Поскольку мне нужен этот основной сайт, я переназначаю основной сайт для обслуживания устаревших браузеров. Если посетитель использует устаревший браузер, предоставьте ему возможность работать в этом браузере. Не старайтесь изо всех сил создавать очень сложное решение, чтобы ваш современный опыт работал в старом браузере. Требуется много работы и полифилов, чтобы заставить что-то работать в средах, которые не должны существовать в течение нескольких лет. - person Chris Love; 21.12.2013
comment
Хорошо, кажется, я понимаю, о чем ты говоришь. Оператор if (window.location.href.indexOf(#!) › 0)... будет выполняться только для старых браузеров. Это было не так ясно из вашего ответа. Если это так, то то, что вы делаете, имеет смысл. - person Gil Birman; 21.12.2013
comment
мило, если я пишу об этом книгу, мне нужно убедиться, что концепция понятна :) - person Chris Love; 21.12.2013