Вопрос по web-crawler, .htaccess, single-page-application, javascript – .htaccess для SEO-ботов, сканирующих одностраничные приложения без хэш-банга

7

ИспользуяpushState активную страницу, обычно вы перенаправляете SEO-ботов, используяescaped_fragment условность. Вы можете прочитать больше об этомВот.

Соглашение предполагает, что вы будете использовать (#!) префикс hashbang перед всеми вашими URI 'на одной странице приложения. SEO-боты будут избегать этих фрагментов, заменяя им хэш-банг »Собственная узнаваемая конвенцияescaped_fragment при оформлении запроса страницы.

//Your page
http://example.com/#!home

//Requested by bots as
http://example.com/?_escaped_fragment=home

Это позволяет администратору сайта обнаруживать ботов и перенаправлять их на предварительно кэшированную страницу.

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^(.*)$  https://s3.amazonaws.com/mybucket/$1 [P,QSA,L]

Проблема в том, что hashbang быстро исчезает благодаря широко адаптированнымpushState служба поддержки. Это'также очень уродливый и неt очень интуитивно понятен для пользователя.

Так что, если бы мы использовали режим HTML5, где pushState направляетвсе пользовательское приложение?

//Your index is using pushState
http://example.com/

//Your category is using pushState (not a folder)
http://example.com/category

//Your category/subcategory is using pushState
http://example.com/category/subcategory

Могут ли правила переписывания вести ботов к вашей кэшированной версии, используя это более новое соглашение?Связано, но учитывает только край индекса. Google такжеесть статья что предлагает использоватьвыбрать в Метод для этого единственного крайнего случая, используя в страницы. Опять же, это для одного крайнего случая. Здесь мы говорим об обработке каждой страницы каквыбрать в senario.I»

http://example.com/?escaped_fragment=
http://example.com/category?escaped_fragment=
http://example.com/category/subcategory?escaped_fragment=

Я думаю, чтоescaped_fragment все еще может быть использован в качестве идентификатора для SEO-ботов, и что я могу извлечь все, что находится между доменом и этим идентификатором, чтобы добавить его в мое местоположение, например:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$
# (high level example I have no idea how to do this)
# extract "category/subcategory" == $2
# from http://example.com/category/subcategory?escaped_fragment=
RewriteRule ^(.*)$  https://s3.amazonaws.com/mybucket/$2 [P,QSA,L]

Какие'лучший способ справиться с этим?

Похоже, что pushState требует, чтобы эти папки были на вашем диске. Таким образом, те, кто поддерживает pushState, смогут видеть и эту страницу, и ботов. pedroassis
Привет @ dan-kanze .. У меня та же проблема .. У тебя есть какое-то решение или что-нибудь, что может мне помочь .. Я застрял с этим Catmandu

Ваш Ответ

4   ответа
0

У меня была точно такая же проблема. Сейчас яМы изменили .htaccess так:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^$ /snapshots/index.html? [L,NC]
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^(.*)$ /snapshots/$1.html? [L,NC]

Не уверен, что еслилучшее решение, но онопока у меня работает.Просто убедитесь, что структура каталогов для ваших снимков соответствует структуре URL.

1

Была похожая проблема в одностраничном веб-приложении.

Единственное решение, которое я нашел для этой проблемы, было эффективное создание статических версий страниц с целью сделать что-то пригодное для навигации роботами Google (и другими).

Вы можете сделать это самостоятельно, но есть также сервисы, которые делают именно это и создают для вас статический кэш (и предоставляют снимки ботам через их CDN).

Я закончил тем, что использовал SEO4Ajax, хотя другие подобные услуги доступны!

0

Я использую PhantomJS для создания статических снимков моих страниц. Моя структура каталогов имеет только один уровень (root а также/projects), поэтому у меня есть два файла .htaccess, в которых я перенаправляю в файл PHP (index-bots.php) который запускает процесс PhantomJS, указанный в моем SPAindex.html и распечатывает визуализированные статические страницы.

Файлы .htaccess выглядят так:

/.htaccess

# redirect search engine bots to index-bots.php
# in order to serve rendered HTML via phantomjs
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/index-bots\.php [NC]
RewriteRule ^(.*)$ index-bots.php?url=%{REQUEST_URI} [L,QSA]

/projects/.htaccess

# redirect search engine bots to index-bots.php
# in order to serve rendered HTML via phantomjs
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ../index-bots.php?url=%{REQUEST_URI} [L,QSA]

Пара заметок:

!-f RewriteCond является критическим! Поскольку .htaccess будет применятьсяRewriteRuleПо всем запросам ресурсы на вашей странице будут перезаписаны в файл PHP, что приведет к раскрутке нескольких экземпляров PhantomJS и поставит ваш сервер на колени.Это'Также важно освободитьindex-bots.php от переписывает, чтобы избежать бесконечного цикла.Я убираю JS в моем скрипте бегуна PhantomJS, чтобы JS неничего не делать, когда боты, поддерживающие его, сталкиваются сстатический» pages.I»нет .htaccess, так чтоВозможно, это лучший способ сделать это. Я'Буду рад услышать это, если так.
0

я использую Symfony2, и хотя яМне сказали другие разработчики, что Googlebot и Bingbot выполняют Javascript достаточно хорошо, чтобы генерировать свои собственные фрагменты HTML, я нечувствую себя уверенно Я также чувствую, что обслуживание статических ресурсов - лучшая альтернатива для ppl, работающей с отключенным JS (хотя это маловероятно), и поэтому я в любом случае заинтересован в обслуживании фрагментов HTML, если это так.не хлопот Ниже приведен метод, который яЯ думаю об использовании, но убежищет попробовал:

Вот другие SO вопросы, которые похожи (один мой).

Angularjs против SEO против pushState

HTML-фрагменты для приложения AngularJS, которое использует pushState?

Вот'Это решение, которое я разместил в этом вопросе, и которое я рассматриваю для себя на случай, если я захочу отправить HTML-фрагменты ботам. Это было бы решением дляБэкэнд Symfony2:

Используйте prerender или другой сервис для генерации статических фрагментов всех ваших страниц. Храните их в доступном для вашего роутера месте.

В вашем файле маршрутизации Symfony2 создайте маршрут, соответствующий вашему SPA. У меня есть тестовый SPA, работающий по адресу localhost.com/ng-test/, поэтому мой маршрут будет выглядеть так:

# Adding a trailing / to this route breaks it. Not sure why.

# This is also not formatting correctly in StackOverflow. This is yaml.

NgTestReroute:

----path: /ng-test/{one}/{two}/{three}/{four}

----defaults:

--------_controller: DriverSideSiteBundle:NgTest:ngTestReroute

--------'one': null

--------'two': null

--------'three': null

--------'four': null

----methods: [GET]

В вашем контроллере Symfony2 проверьте user-agent, чтобы увидеть,с Googlebot или Bingbot. Вы должны быть в состоянии сделать это с помощью приведенного ниже кода, а затем использовать этот список для нацеливания ботов, которых вызаинтересован в (http://www.searchenginedictionary.com/spider-names.shtml) ...

if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot"))

{

// what to do

}

Если ваш контроллер находит совпадение с ботом, отправьте ему фрагмент HTML. В противном случае, как и в случае с моим приложением AngularJS, просто отправьте пользователя на страницу индекса, а Angular сделает все остальное.

Кроме того, если на ваш вопрос ответили, пожалуйста, выберите один, чтобы я и другие могли сказать, что сработало для вас.

Похожие вопросы