Обработка _escaped_fragment_ на корневом пути в AppEngine

Я использую Google App Engine для размещения приложения AngularJS с веб-службой Python. Корневой путь / настроен на возврат index.html, запросы /api/* направляются к контроллерам Python для вызовов веб-сервисов, а любой другой путь ведет к статическим ресурсам (изображениям, представлениям и т. д.).

Я пытаюсь использовать метод hashbang/_escaped_fragment_, чтобы настроить приложение для индексации поисковой системы. Насколько я понимаю, URL-адрес http://www.whatever.com/#!/news будет преобразован поисковой системой в http://www.whatever.com/?_escaped_fragment_=/news

Не проблема написать какой-то код для обработки этого запроса, но проблема в том, чтобы этот код прослушивал корневой путь, поскольку он сопоставлен с index.html.

Есть ли метатег или что-то, чтобы указать поисковым системам использовать другой путь (не /) при выдаче запроса _escaped_fragment_?

Если нет, есть ли способ в Google App Engine получать запросы на/обслуживать index.html, но если параметр запроса _escaped_fragment_ есть, то перейти к контроллеру для обработки запроса?

На данный момент единственное, что я нашел работающим, — это наличие контроллера для корневого пути, где он проверяет параметр _escaped_fragment_. Если есть, то рендерит контент для поисковой системы, если нет, то читает index.html и записывает в ответ. Я надеюсь, что есть лучший вариант.


person user605331    schedule 29.01.2014    source источник


Ответы (1)


Вы можете просто добавить на свою страницу следующее, а затем обработать www.example.com?_escaped_fragment_=:

<meta name="fragment" content="!">

Из руководства по началу работы Google Developers for Making AJAX Applications Scanable:

Другими словами, если вы поместите <meta name="fragment" content="!"> на страницу www.example.com, сканер временно сопоставит этот URL с www.example.com?_escaped_fragment_= и запросит это с вашего сервера. Затем ваш сервер должен вернуть снимок HTML, соответствующий www.example.com.


Также со страницы Полная спецификация и, в частности, из раздела Страницы без хеш-фрагментов:

Применяются следующие важные ограничения:

  1. Метатег может появляться только на страницах без хеш-фрагментов.
  2. Только "!" может появиться в поле содержимого.
  3. Метатег должен находиться в заголовке документа.
person Lipis    schedule 29.01.2014
comment
Возможно, я неправильно понимаю ваш ответ, но это похоже на то, что я уже делаю. Я пытаюсь заставить сканер сделать запрос на www.example.com/crawler-prefix/?_escaped_fragment_=/original/path Префикс сканера — это главное, что я пытаюсь заставить работать здесь. Если это невозможно сделать, то я искал способ в App Engine сопоставить путь / со статическим файлом, если только параметр запроса не существует, и в этом случае я хочу, чтобы он перешел к контроллеру. - person user605331; 29.01.2014
comment
@user605331 user605331 Думаю, теперь я вас понял.. вам придется обрабатывать это в приложении, а не отображать его только в app.yaml, и если для запроса / нет параметра _escaped_fragment_, визуализируйте AngularJS с включенным index.html, иначе отобразите что-нибудь для сканеров .. - person Lipis; 29.01.2014
comment
Хорошо, тогда это то, что я делаю сейчас. К сожалению, нет более приятного способа справиться с этим делом. - person user605331; 30.01.2014
comment
@user605331 user605331 ну, для других запросов вам все равно придется это делать ... так почему бы не обработать это и для корневого пути? Это не полностью статичный сайт, потому что иначе как вы будете генерировать страницы, необходимые для поисковых роботов?! - person Lipis; 30.01.2014