7

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

Соглашение предполагает, что вы используете префикс 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. Это также очень уродливо и не очень интуитивно понятно для пользователя.

Итак, что, если мы использовали режим 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 

Можно ли переписать правила для ботов в вашу кеш-версию, используя это новое соглашение? Related but only accounts for index edge case. Google также has an article, который предлагает использовать метод opt-in для этого случая с одним краем, используя <meta name="fragment" content="!"> на странице <head>. Опять же, это для одного края. Здесь мы говорим об обработке каждой страницы как opt-in senario.

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

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

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] 

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

+0

Привет @ dan-kanze .. У меня такая же проблема. У вас есть какое-то решение или что-то, что может мне помочь. Застрял с этим – Catmandu

+0

Я был там, PushState, похоже, требует вы должны иметь эти папки на своем диске. Таким образом, те, кто поддерживает pushState, смогут увидеть эту страницу, а также ботов. – pedroassis

ответ

1

Имеет аналогичную проблему в одностраничном веб-приложении.

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

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

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

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.

0

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

Другие подобные вопросы (один мой).
Angularjs vs SEO vs pushState
HTML snippets for AngularJS app that uses pushState?

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

  1. Использование PreRender или другой сервис для создания статических фрагментов всех страниц. Храните их в любом месте, доступном вашему маршрутизатору.
  2. В вашем файле маршрутизации 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]

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

    if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot"))
    {
    // what to do
    }

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

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

0

Я использую PhantomJS для создания статических снимков моих страниц. Моя структура каталогов - только один уровень (root и /projects), поэтому у меня есть два файла .htaccess, в которых я перенаправляюсь к файлу PHP (index-bots.php), который запускает процесс PhantomJS, указанный в моем SPA index.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] 

Несколько примечаний:

  • !-fRewriteCond критично! Поскольку .htaccess будет применять RewriteRule s ко всем запросам, активы на вашей странице будут переписаны в файл PHP, развернув несколько экземпляров PhantomJS и доведя ваш сервер до колен.
  • Также важно освободить index-bots.php от перезаписи, чтобы избежать бесконечного цикла.
  • Я снимаю JS в своем сценарии бегунов PhantomJS, чтобы гарантировать, что JS ничего не делает, когда боты, которые его поддерживают, сталкиваются с «статическими» страницами.
  • Я не мастер .htaccess, поэтому, вероятно, лучший способ сделать это. Я бы хотел услышать это, если так.