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

После прочтения этой треда я решил использовать pushstate API в моем приложение angularjs, которое полностью основано на API (независимый интерфейс и независимый сервер).

Вот мой тестовый сайт: http://huyaks.com/index.html

Я создал карту сайта и загрузил ее в инструменты Google для веб-мастеров.

Из того, что я вижу:

Google проиндексировал главную страницу, проиндексировал динамическую навигацию (круто!), но не проиндексировал динамические URL-адреса. Пожалуйста, посмотрите.

Я изучил пример сайта, приведенный в соответствующей ветке:

http://html5.gingerhost.com/london

Насколько я вижу, когда я напрямую обращаюсь к определенной странице, контент, который считается динамическим, возвращается сервером, поэтому он индексируется. Но в моем случае это невозможно, так как мое приложение полностью динамическое.

Не могли бы вы подсказать, в чем проблема в моем конкретном случае и как ее исправить?

Заранее спасибо.

Примечание: этот вопрос касается способа pushState. Пожалуйста, не советуйте мне использовать экранированные фрагменты или сторонние сервисы, такие как prerender.io. Я хотел бы выяснить, как использовать этот подход.


person Sray    schedule 05.10.2014    source источник


Ответы (4)


Очевидно, Квентин не читал сообщение, на которое вы ссылаетесь. Вся суть http://html5.gingerhost.com/london заключается в следующем. что он использует pushState и доказывает, что ему не требуется статический HTML в интересах поисковых роботов.

«Этот сайт использует HTML5 wizrdry [sic] для асинхронной загрузки «фактического контента» [sic] с остальной частью кода: это делает его быстрее для пользователей, но он по-прежнему полностью индексируется поисковыми системами».

Помимо хитроумной орфографии, эта демонстрация показывает, что асинхронно загружаемый контент индексируется.

person djadomi    schedule 25.10.2014
comment
Спасибо за ваш ответ. Однако этот вопрос для меня до сих пор не решен. Как я уже упоминал ранее, в этой демонстрации также используется предварительно обработанный контент (попробуйте открыть исходный код:html5.gingerhost.com/new-york в Chrome, и вы поймете, что я имею в виду). Поэтому он проиндексирован. В моем конкретном случае была проиндексирована только динамическая навигация. Динамические страницы не проиндексированы. Что я делаю неправильно? Не могли бы вы взглянуть на мою демонстрацию? - person Sray; 27.10.2014
comment
См. мой тест, который проиндексирован по адресу google.com/ Это не статическая версия. Данные находятся по адресу coger.me/data/data.json (для которого CORS настроен на разрешить это.) - person djadomi; 02.12.2014

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

Это не так. Вы загружаете пустую страницу с некоторым JavaScript, и этот JavaScript сразу же загружает контент, который должен отображаться для этого URL.

Вам нужно, чтобы сервер создавал HTML, который вы получаете после запуска JavaScript, и не зависел от JS.

person Quentin    schedule 05.10.2014
comment
Часть моего сообщения была связана с html5.gingerhost.com/london. Они возвращают статический контент. ››››Вам нужно, чтобы сервер создавал HTML-код, который вы получаете после запуска JavaScript, и не зависел от JS. Вы говорите, что я все равно должен передавать статический контент для ботов Google? - person Sray; 05.10.2014
comment
Да. Вам нужен статический контент. - person Quentin; 05.10.2014
comment
Хорошо, спасибо за ваш ответ. Допустим, я хотел бы использовать phantomjs. Как я могу запустить его с помощью pushstate angularjs? Существует множество статей о том, как работать с обычными URL-адресами (хеш-бангами), но я не совсем понимаю, как указать поисковым ботам использовать статический контент, поскольку экранированные фрагменты не используются. - person Sray; 05.10.2014
comment
@Quentin, это действительно уже не на 100% точно, вам НЕ НУЖНО иметь статический контент. Я видел примеры (один из которых указан в ОП) сайтов с проиндексированным контентом, который на 100% является динамическим контентом. Лично у меня есть сайт, на 100% управляемый Angular и API, страницы которого проиндексированы. Я не совсем готов сказать, что (относительно недолгие) дни требования предварительно обработанного контента прошли, но если бы это было моим делом, я бы очень нервничал, потому что Google и Bing могут читать динамические страницы, управляемые JS. и работают над тем, чтобы сделать предварительный рендеринг ненужным. - person LocalPCGuy; 29.10.2014
comment
К сожалению, я заметил, что сайт, указанный в OP, отображает статические данные при прямом доступе к маршруту. Но я определенно видел и создавал сайты, которые на 100% динамичны, и такой же динамический контент индексируется Google. Я думаю, что предоставление статического контента по-прежнему довольно важно, но, по моему мнению, с каждым месяцем становится все меньше. - person LocalPCGuy; 29.10.2014

Google интерпретирует страницы Angular, как вы можете видеть на этой быстрой демонстрационной странице, где заголовок и метаописание правильно отображаться в результат поиска.

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

Тот факт, что некоторые страницы не индексируются, связан с тем, что Google индексирует не каждую страницу, которую они анализируют, даже если вы добавите ее в карту сайта или отправите на индексацию в инструментах для веб-мастеров. На демонстрационной странице как обычная, так и ограниченная ссылка в настоящее время не индексируются.

Обновление: чтобы конкретно ответить на вопрос, на тестовом сайте нет проблем с pushState. Эти страницы просто не содержат ценного контента для Google. (См. их общие рекомендации).

person Sam    schedule 03.12.2014

Срей, недавно я задал тот же вопрос в другой ветке, и мне сообщили, что Googlebot и Bingbot индексируют SPA, использующие pushState. Я не видел ни одного примера, подтверждающего мою уверенность, но это то, что мне сказали. Чтобы затем охватить свои базы в отношении Facebook, используйте метатеги open graph.

Я все еще не уверен в том, что можно продвигаться вперед без отправки фрагментов HTML ботам, но, как и вы, я не нашел учебника, рассказывающего, как это сделать при использовании pushState, или даже предлагающего это. Но вот как я представляю, как это будет работать с Symfony2...

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

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

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

person Miguel Valencia    schedule 14.01.2015