Как поисковые системы работают с приложениями AngularJS?

697

Я вижу две проблемы с приложением AngularJS относительно поисковых систем и SEO:

1) Что происходит с пользовательскими тегами? Игровые системы игнорируют весь контент в этих тегах? то есть предположим, что у меня есть

<custom>
  <h1>Hey, this title is important</h1>
</custom>

будет <h1>проиндексирован, несмотря на то, что внутри пользовательских тегов?


2) Есть ли способ избежать поисковых систем индексирования {{}} буквально? т.е.

<h2>{{title}}</h2>

Я знаю, что могу сделать что-то вроде

<h2 ng-bind="title"></h2>

но что, если я действительно хочу, чтобы сканер "увидел" заголовок? Является ли рендеринг на стороне сервера единственным решением?

luisfarzati
источник
17
все эти «решения» просто заставляют меня отказаться от таких технологий, как AngularJS, по крайней мере до тех пор, пока у google et all не появятся более умные сканеры.
Codemonkey
22
@Codemonkey: Да, можно задаться вопросом, почему из всех AngularJS, который является продуктом Google, не было предложено встроенное решение для этого .. На самом деле странно ..
Рой МДж
11
На самом деле, Миско написал Angular до того, как работал в Google. Google сейчас спонсирует проект, но они не являются авторами.
Сверхсветовой
2
Возможно, кто-то здесь может / должен обновить статью Википедии о SPA, которая гласит: «SPA обычно не используются в контексте, где индексация в поисковых системах является либо обязательным требованием, либо желательным». en.wikipedia.org/wiki/Single-page_application [# Поисковая оптимизация] Существует огромный абзац о (неясной) основанной на Java фреймворке под названием IsNat, но нет никаких предположений о том, что SEO решалась подобными Angularjs.
Линоджон
3
@Roy MJ - Почему никто не видит намерения? PageSpeed, Angular и т. Д. Являются врагами естественных, органических списков в поисковой выдаче. Преднамеренно. Если у вас есть огромная бизнес-модель, основанная на плате за клики ... как лучше заставить людей платить за свои списки, чем создавать целый набор инструментов, который не даст им выбора, кроме как сделать это? Вместо того чтобы создавать качественные веб-сайты, наполненные ценным контентом, эта отрасль теперь переполнена читами и решениями, которые не достигают или не решают приседания.
Стивен Вентимилья

Ответы:

403

Обновление май 2014

Сканеры Google теперь выполняют JavaScript - вы можете использовать Инструменты Google для веб-мастеров, чтобы лучше понять, как Google отображает ваши сайты.

Оригинальный ответ
Если вы хотите оптимизировать свое приложение для поисковых систем, к сожалению, нет способа обойтись предварительно обработанной версией для сканера. Вы можете прочитать больше о рекомендациях Google для сайтов с ajax и javascript здесь .

Если это вариант, я бы рекомендовал прочитать эту статью о том, как сделать SEO для Angular с рендерингом на стороне сервера.

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

joakimbl
источник
13
Это больше не актуально. Теперь вы должны использовать pushState. Нет необходимости обслуживать отдельную статическую версию сайта.
суперсветовой
3
даже с обновлением Google ng-view не будет отображаться правильно, как я вижу в инструментах Google для веб-мастеров
tschiela
10
Да, только потому, что они выполняют JavaScript, не означает, что ваша страница будет проиндексирована правильно. Самый безопасный способ - обнаружить пользовательский агент бота Google, использовать браузер без заголовка, такой как phantomjs, получить page.contentи вернуть статический html.
тестер
6
Я понимаю, что этот вопрос специфичен для SEO, но имейте в виду, что другие сканеры (Facebook, Twitter и т. Д.) Еще не могут оценить JavaScript. Например, совместное использование страниц на сайтах социальных сетей все еще будет проблемой без стратегии рендеринга на стороне сервера.
Стивен Уоткинс
3
Кто-нибудь может привести пример правильной индексации сайта AngularJS без реализации спецификации схемы сканирования Google?
check_ca
470

Используйте PushState и Precomposition

Текущий (2015) способ сделать это - использовать метод pushState в JavaScript.

PushState изменяет URL-адрес в верхней панели браузера без перезагрузки страницы. Скажем, у вас есть страница, содержащая вкладки. Вкладки скрывают и отображают содержимое, а содержимое вставляется динамически, либо с помощью AJAX, либо просто путем настройки display: none и display: block, чтобы скрыть и отобразить правильное содержимое вкладки.

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

Precomposition

Существует два способа использования одностраничного приложения PushState (SPA).

  1. Через PushState, где пользователь нажимает ссылку PushState и содержимое AJAXed.
  2. Нажав на ссылку напрямую.

Первоначальное попадание на сайт будет заключаться в прямом обращении к URL. Последующие попадания будут просто AJAX в контенте, когда PushState обновляет URL.

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

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

Есть основания полагать, что Google может не выполнять запросы AJAX. Подробнее об этом здесь:

https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo

Поисковики могут читать и выполнять JavaScript

Google уже некоторое время может анализировать JavaScript, поэтому они изначально разработали Chrome, чтобы выступать в качестве полнофункционального безголового браузера для паука Google. Если ссылка имеет действительный атрибут href, новый URL может быть проиндексирован. Больше нечего делать.

Если, кроме того, нажатие на ссылку вызывает вызов pushState, пользователь может перемещаться по сайту через PushState.

Поддержка поисковой системы для PushState URL

PushState в настоящее время поддерживается Google и Bing.

Google

Вот Мэтт Каттс, отвечающий на вопрос Пола Айриша о PushState для SEO:

http://youtu.be/yiAF9VdvRPw

Вот Google объявляет о полной поддержке JavaScript для паука:

http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html

В результате Google поддерживает PushState и будет индексировать URL-адреса PushState.

Смотрите также выбор инструментов Google для веб-мастеров как Googlebot. Вы увидите, что ваш JavaScript (включая Angular) выполнен.

Bing

Вот объявление Bing о поддержке красивых URL-адресов PushState от марта 2013 года:

http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/

Не используйте HashBangs #!

URL-адреса Hashbang были отвратительным временным промежутком, требующим от разработчика предоставить предварительно отрендеренную версию сайта в специальном месте. Они все еще работают, но вам не нужно их использовать.

URL-адреса Hashbang выглядят так:

domain.com/#!path/to/resource

Это будет в сочетании с метатегом, как это:

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

Google не будет индексировать их в этой форме, а вместо этого извлечет статическую версию сайта из URL-адреса _escaped_fragments_ и проиндексирует ее.

URL-адреса Pushstate выглядят как любой обычный URL:

domain.com/path/to/resource

Разница в том, что Angular обрабатывает их для вас, перехватывая изменения в document.location, связанные с ним в JavaScript.

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

Тестирование вашего сайта

Инструменты Google для веб-мастеров теперь содержат инструмент, который позволит вам извлекать URL-адрес как google и отображать JavaScript так, как это делает Google.

https://www.google.com/webmasters/tools/googlebot-fetch

Генерация PushState URL в Angular

Чтобы генерировать реальные URL-адреса в Angular, а не с префиксом #, установите режим HTML5 для вашего объекта $ locationProvider.

$locationProvider.html5Mode(true);

Сторона сервера

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

Карта сайта

Ваше приложение может использовать необычные формы навигации, например, при наведении курсора или прокрутке. Чтобы гарантировать, что Google может управлять вашим приложением, я бы, вероятно, предложил создать карту сайта, простой список всех URL-адресов, на которые реагирует ваше приложение. Вы можете разместить его в расположении по умолчанию (/ sitemap или /sitemap.xml) или сообщить об этом Google, используя инструменты для веб-мастеров.

В любом случае, хорошая идея иметь карту сайта.

Поддержка браузера

Pushstate работает в IE10. В старых браузерах Angular автоматически использует URL-адреса в стиле хэширования.

Демо-страница

Следующее содержимое отображается с помощью pushstate URL с предкомпозицией:

http://html5.gingerhost.com/london

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

Обслуживание кодов заголовка 404 и 301

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

superluminary
источник
Я должен разобраться в этом - спасибо за объяснение. Я постоянно задаюсь вопросом: запускает ли Google сейчас javascript перед индексацией страницы?
JVV
1
«PushState изменяет URL-адрес в верхней панели браузера, не перезагружая страницу ... Когда нажимаются вкладки, используйте pushState для обновления URL-адреса в адресной строке. Когда страница отображается, используйте значение в адресной строке, чтобы определить, какой вкладка, чтобы показать. Угловая маршрутизация сделает это автоматически. " Лампочка!
atconway
1
@superluminary, не могли бы вы рассказать немного глубже? Особенно раздел «Сторона сервера». Я использую angularjs + angularjs-route + locationProvider.html5Mode + api + динамическая навигация (не статическая, как на html5.gingerhost.com. URL-адреса отображаются хорошо, однако содержимое не индексируется. Нужно ли служить каким-либо статическим контентом при доступе к странице по прямой ссылке? Я на самом деле смущен этим сообщением: >> вам нужно будет убедиться, что ваш сервер отправляет один и тот же шаблон для всех действительных URL. Не могли бы вы объяснить это? Спасибо заранее.
Срай
1
@sray - если каждый URL на вашем сайте обслуживает один и тот же шаблон, браузер сможет получить этот шаблон, а Angular сможет взять его оттуда, проверив URL и предоставив правильный контент. Если при нажатии этого URL-адреса непосредственно на сервере возвращается 404 или 500, у вас есть проблема, прямые ссылки не будут работать, закладки не будут работать, и вы не будете проиндексированы. Вы видите сейчас?
Сверхсветовой
1
@ user3339411 - У вас должен быть один URL на каждую страницу, на которую будет отвечать ваш сайт. Если ваш сайт должен отвечать только на один URL с одним набором контента, вам вообще не нужна маршрутизация. Это хорошо для простого сайта. Однако, если ваш сайт вводит разные данные (через JSON) для разных URL, имеет смысл использовать маршрутизацию. Поскольку статические страницы Github основаны на файлах, вам потребуется фактический HTML-файл, поддерживающий каждый URL в этом случае. Не существует правила, согласно которому сайт должен быть основан на файлах, и если вы используете альтернативную платформу, вы можете использовать один и тот же шаблон для нескольких URL-адресов.
суперсветовой
107

Давайте определимся с AngularJS и SEO

Google, Yahoo, Bing и другие поисковые системы сканируют Интернет традиционными способами, используя традиционные сканеры. Они запускают роботов, которые сканируют HTML на веб-страницах, собирая информацию по пути. Они хранят интересные слова и ищут другие ссылки на другие страницы (эти ссылки, их количество и количество вступают в игру с SEO).

Так почему же поисковые системы не работают с сайтами на JavaScript?

Ответ связан с тем фактом, что роботы поисковых систем работают через браузеры без заголовка, и они чаще всего не имеют движка рендеринга javascript для рендеринга javascript страницы. Это работает для большинства страниц, так как большинство статических страниц не заботятся о том, чтобы JavaScript отображал их страницу, так как их содержимое уже доступно.

Что с этим можно сделать?

К счастью, сканеры более крупных сайтов начали реализовывать механизм, который позволяет нам делать наши JavaScript-сайты доступными для сканирования, но это требует от нас внесения изменений в наш сайт .

Если мы изменим наше hashPrefixзначение #!вместо простого #, то современные поисковые системы изменят запрос на использование _escaped_fragment_вместо #!. (В режиме HTML5, то есть там, где у нас есть ссылки без префикса хеша, мы можем реализовать эту же функцию, посмотрев на User Agentзаголовок в нашем бэкэнде).

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

http://www.ng-newsletter.com/#!/signup/page

Поисковая система будет искать страницу с:

http://www.ng-newsletter.com/?_escaped_fragment_=/signup/page

Мы можем установить хэш-префикс наших приложений Angular, используя встроенный метод из ngRoute:

angular.module('myApp', [])
.config(['$location', function($location) {
  $location.hashPrefix('!');
}]);

И, если мы используем html5Mode, нам нужно реализовать это, используя метатег:

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

Напоминание, мы можем установить html5Mode()с $locationсервисом:

angular.module('myApp', [])
.config(['$location', 
function($location) {
  $location.html5Mode(true);
}]);

Обработка поисковой системы

У нас есть много возможностей определить, как мы будем справляться с фактической доставкой контента поисковым системам в виде статического HTML. Мы можем самостоятельно разместить бэкэнд, мы можем использовать сервис для размещения бэкэнда для нас, мы можем использовать прокси для доставки контента и т. Д. Давайте рассмотрим несколько вариантов:

Самопринятый

Мы можем написать сервис для обработки сканирования нашего собственного сайта, используя браузер без заголовка, такой как phantomjs или zombiejs, делая снимок страницы с визуализированными данными и сохраняя его в виде HTML. Всякий раз, когда мы видим строку запроса ?_escaped_fragment_в поисковом запросе, мы можем доставить статический снимок HTML, который мы взяли на странице, вместо предварительно отрендеренной страницы только через JS. Это требует от нас иметь бэкэнд, который доставляет наши страницы с условной логикой посередине. Мы можем использовать что - то вроде prerender.io в бэкэнде в качестве отправной точки для запуска этого самого. Конечно, нам все еще нужно обрабатывать прокси и обработку фрагментов, но это хорошее начало.

С платным сервисом

Самый простой и быстрый способ получения контента в поисковой системе , чтобы воспользоваться услугой Brombone , seo.js , seo4ajax и prerender.io являются хорошими примерами таких , которые будут принимать вышеуказанную рендеринга контента для вас. Это хороший вариант для тех случаев, когда мы не хотим иметь дело с запуском сервера / прокси. Кроме того, это обычно очень быстро.

Для получения дополнительной информации об Angular и SEO мы написали обширное руководство по этому адресу по адресу http://www.ng-newsletter.com/posts/serious-angular-seo.html, и мы подробно остановились на этом в нашей книге ng-book: Полная книга на AngularJS . Проверьте это на ng-book.com .

Пользователь
источник
1
SEO4Ajax также является хорошим примером платного сервиса (бесплатный во время бета-тестирования). К сожалению, похоже, мне не разрешено редактировать этот ответ, чтобы добавить его в список.
check_ca
1
@auser Вы все еще рекомендуете этот подход? Более новый комментарий с наибольшим количеством голосов, кажется, препятствует этому подходу.
Лыча
Это отличный пример того, почему мы никогда не должны говорить такие вещи, как «полное руководство» в CS :). Основные поисковые системы теперь исполняют Javascript, поэтому этот ответ необходимо переписать или полностью удалить.
Себ
1
@seb это все еще нужно, скажем, для тегов открытого графика, которые должны быть на странице, когда роботы сканируют ее. Например, карты Facebook или Twitter нуждаются в этом. Но этот ответ должен быть обновлен, чтобы сосредоточиться на push5te HTML5 вместо hashbang, который устарел сейчас.
Адриенденат
@ Grsmto ты прав! Тогда я думаю, что это должно быть переписано, потому что это говорит о том, что основные поисковые системы не выполняют JS, что больше не соответствует действительности.
Себ
57

Вы должны действительно изучить руководство по созданию SEO-дружественного сайта AngularJS в год блога moo. Он проведет вас через все шаги, описанные в документации Angular. http://www.yearofmoo.com/2012/11/angularjs-and-seo.html

Используя эту технику, поисковая система видит расширенный HTML вместо пользовательских тегов.

Брэд Грин
источник
@ Брэд Грин, несмотря на то, что вопрос был закрыт (по каким-либо причинам), вы могли бы ответить на него. Наверное, мне чего-то не хватает: stackoverflow.com/questions/16224385/…
Кристоф
41

Это резко изменилось.

http://searchengineland.com/bing-offers-recommendations-for-seo-friendly-ajax-suggests-html5-pushstate-152946

Если вы используете: $ locationProvider.html5Mode (true); вы настроены

Нет больше рендеринга страниц.

user3330270
источник
3
Это должно быть лучшим ответом сейчас. Мы находимся в 2014 году, и ответ @joakimbl больше не является оптимальным.
Стэн
11
Это неверно В этой статье (с марта 2013 года) ничего не сказано о выполнении Bing javascript. Bing просто дает рекомендацию использовать pushstate вместо их предыдущей рекомендации по использованию #!. Из статьи: «Bing сообщает мне, что, хотя они все еще поддерживают версию!! Для сканирования AJAX, первоначально выпущенную Google, они обнаруживают, что большую часть времени она не реализована правильно, и вместо этого настоятельно рекомендуют pushState». Вам все еще нужно визуализировать статический HTML и использовать его для _escaped_fragment_URL. Bing / Google не будет выполнять вызовы javascript / AJAX.
Prerender.io
2
Вам все еще нужно _escaped_fragment_и рендерить чистые HTML-страницы. Это ничего не решает, приятель.
Стэн
Все еще робот Google не может видеть динамическое содержание моего сайта, только пустую страницу.
Calmbird
Поисковый сайт: mysite.com показывает {{staff}}, а не контент, загруженный через AngularJS. Как будто Google Crawler никогда не слышал о JavaScript. Что я могу сделать?
Инструментарий
17

С тех пор, как был задан этот вопрос, все немного изменилось. Теперь есть варианты, позволяющие Google индексировать ваш сайт AngularJS. Самым простым вариантом, который я нашел, было использование бесплатного сервиса http://prerender.io , который сгенерирует для вас поддающиеся обработке страницы и предоставит их поисковым системам. Он поддерживается практически на всех серверных веб-платформах. Я недавно начал использовать их, и поддержка тоже отличная.

Я не имею никакого отношения к ним, это исходит от счастливого пользователя.

Ketan
источник
6
Код для prerender.io находится на github ( github.com/collectiveip/prerender ), поэтому любой может запустить его на своих собственных серверах.
user276648
Это также устарело. Смотрите ответ @ user3330270 ниже.
Les Hazlewood
2
Это не устарело. @ user3330270 неверный ответ. В статье, на которую они ссылаются, просто говорится, что нужно использовать pushstate вместо # !. Вам все равно придется отображать статические страницы для сканеров, потому что они не выполняют JavaScript.
Prerender.io
9

Собственный веб-сайт Angular предоставляет упрощенный контент для поисковых систем: http://docs.angularjs.org/?_escaped_fragment_=/tutorial/step_09

Скажем, ваше Angular-приложение использует JSON-API, управляемый Node.js / Express /api/path/to/resource. Возможно, вы могли бы перенаправить любые запросы ?_escaped_fragment_в /api/path/to/resource.htmlи использовать согласование содержимого для визуализации HTML-шаблона содержимого, а не возвращать данные JSON.

Единственное, ваши угловые маршруты должны соответствовать 1: 1 с вашим REST API.

РЕДАКТИРОВАТЬ : я понимаю, что это может действительно запутать ваш REST API, и я не рекомендую делать это вне очень простых случаев использования, где это может быть естественной подгонки.

Вместо этого вы можете использовать совершенно другой набор маршрутов и контроллеров для своего дружественного роботу контента. Но затем вы дублируете все ваши маршруты и контроллеры AngularJS в Node / Express.

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

Кевин С.
источник
7

На данный момент Google изменил свое предложение по сканированию AJAX.

Времена изменились. Сегодня, пока вы не запрещаете роботу Googlebot сканировать файлы JavaScript или CSS, мы обычно можем отображать и понимать ваши веб-страницы, как современные браузеры.

tl; dr: [Google] больше не рекомендует предложение сканирования AJAX [Google], сделанное еще в 2009 году.

Тор
источник
@ Toolkit что ты имеешь ввиду?
Тор
1
Робот Google не может анализировать сайты Angular
Инструментарий
4
@Toolkit Вы говорите об абсолютном обруче, мой полный сайт Angular был проиндексирован Google с динамическими метаданными без каких-либо проблем
twigg
@ twigg у вас неверная логика, вы имеете в виду, что если один (ваш) сайт Angular был проиндексирован, все были. Ну, у меня есть для тебя сюрприз. Никто из моих не был проиндексирован. Может быть потому, что я использую угловой UI-маршрутизатор или кто знает почему. Даже на главных страницах без каких-либо данных ajax
Набор инструментов
@Toolkit Если даже ваши статические html-страницы не проиндексированы, это не имеет никакого отношения к способности Google сканировать файлы JS. Если вы говорите, что Google не может сканировать что-либо правильно ... ну, я думаю, что вы не правы
phil294
6

Crawlable Ajax Spec от Google, как указано в других ответах здесь, является в основном ответом.

Если вас интересует, как другие поисковые системы и социальные боты решают те же проблемы, я описал состояние дел здесь: http://blog.ajaxsnapshots.com/2013/11/googles-crawlable-ajax-specification.html

Я работаю на https://ajaxsnapshots.com , компанию, которая реализует Crawlable Ajax Spec в качестве службы - информация в этом отчете основана на наблюдениях из наших журналов.

Роберт AJS
источник
Ссылка внизу в указанном блоге. Ajaxsnapshots.com
Кевин
4

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

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

Также обратите внимание: это не полные файлы, а важные части тех, которые имеют отношение к делу. Если вам нужна помощь в написании шаблона для директив, услуг и т. Д., Которые можно найти в другом месте. Во всяком случае, здесь идет ...

app.js

Здесь вы предоставляете собственные метаданные для каждого из ваших маршрутов (заголовок, описание и т. Д.)

$routeProvider
   .when('/', {
       templateUrl: 'views/homepage.html',
       controller: 'HomepageCtrl',
       metadata: {
           title: 'The Base Page Title',
           description: 'The Base Page Description' }
   })
   .when('/about', {
       templateUrl: 'views/about.html',
       controller: 'AboutCtrl',
       metadata: {
           title: 'The About Page Title',
           description: 'The About Page Description' }
   })

metadata-service.js (сервис)

Устанавливает пользовательские параметры метаданных или использует значения по умолчанию в качестве запасных.

var self = this;

// Set custom options or use provided fallback (default) options
self.loadMetadata = function(metadata) {
  self.title = document.title = metadata.title || 'Fallback Title';
  self.description = metadata.description || 'Fallback Description';
  self.url = metadata.url || $location.absUrl();
  self.image = metadata.image || 'fallbackimage.jpg';
  self.ogpType = metadata.ogpType || 'website';
  self.twitterCard = metadata.twitterCard || 'summary_large_image';
  self.twitterSite = metadata.twitterSite || '@fallback_handle';
};

// Route change handler, sets the route's defined metadata
$rootScope.$on('$routeChangeSuccess', function (event, newRoute) {
  self.loadMetadata(newRoute.metadata);
});

metaproperty.js (директива)

Пакет результатов службы метаданных для представления.

return {
  restrict: 'A',
  scope: {
    metaproperty: '@'
  },
  link: function postLink(scope, element, attrs) {
    scope.default = element.attr('content');
    scope.metadata = metadataService;

    // Watch for metadata changes and set content
    scope.$watch('metadata', function (newVal, oldVal) {
      setContent(newVal);
    }, true);

    // Set the content attribute with new metadataService value or back to the default
    function setContent(metadata) {
      var content = metadata[scope.metaproperty] || scope.default;
      element.attr('content', content);
    }

    setContent(scope.metadata);
  }
};

index.html

В комплекте с жестко закодированными тегами возврата, упомянутыми ранее, для сканеров, которые не могут поднять Javascript.

<head>
  <title>Fallback Title</title>
  <meta name="description" metaproperty="description" content="Fallback Description">

  <!-- Open Graph Protocol Tags -->
  <meta property="og:url" content="fallbackurl.com" metaproperty="url">
  <meta property="og:title" content="Fallback Title" metaproperty="title">
  <meta property="og:description" content="Fallback Description" metaproperty="description">
  <meta property="og:type" content="website" metaproperty="ogpType">
  <meta property="og:image" content="fallbackimage.jpg" metaproperty="image">

  <!-- Twitter Card Tags -->
  <meta name="twitter:card" content="summary_large_image" metaproperty="twitterCard">
  <meta name="twitter:title" content="Fallback Title" metaproperty="title">
  <meta name="twitter:description" content="Fallback Description" metaproperty="description">
  <meta name="twitter:site" content="@fallback_handle" metaproperty="twitterSite">
  <meta name="twitter:image:src" content="fallbackimage.jpg" metaproperty="image">
</head>

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

Надеюсь это поможет!

Эндрю
источник
Я также следую этому решению и до этого думал, но хочу спросить, будет ли поисковая система читать содержимое пользовательских тегов.
Равиндер Паял
@RavinderPayal вы можете проверить это решение с seoreviewtools.com/html-headings-checker
Виджай
2

Используйте что-то вроде PreRender, он создает статические страницы вашего сайта, чтобы поисковые системы могли его проиндексировать.

Здесь вы можете узнать, для каких платформ он доступен: https://prerender.io/documentation/install-middleware#asp-net

NicoJuicy
источник
угловой для облегчения работы или просто удорожания операций и времени
Ravinder Payal
2

С помощью Angular Universal вы можете создавать целевые страницы для приложения, которые выглядят как законченное приложение, а затем загружать приложение Angular за ним.
Angular Universal генерирует чистые HTML-страницы, не поддерживающие JavaScript, на стороне сервера и предоставляет их пользователям без задержки. Таким образом, вы можете иметь дело с любым сканером, ботом и пользователем (у которых уже есть низкий процессор и скорость сети). Затем вы можете перенаправить их по ссылкам / кнопкам в ваше реальное угловое приложение, которое уже загружено за ним. Это решение рекомендовано официальным сайтом. -Больше информации о SEO и Angular Universal-

erginduran
источник
1

Программы-обходчики (или боты) предназначены для сканирования содержимого веб-страниц в формате HTML, но из-за операций AJAX для асинхронной выборки данных это стало проблемой, поскольку для отображения страницы и отображения на ней динамического содержимого требуется некоторое время. Аналогичным образом AngularJSтакже используется асинхронная модель, которая создает проблему для сканеров Google.

Некоторые разработчики создают базовые HTML-страницы с реальными данными и обслуживают эти страницы со стороны сервера во время сканирования. Мы можем отображать те же страницы PhantomJSна стороне службы, которая имеет _escaped_fragment_(потому что Google ищет #!в URL нашего сайта, а затем берет все после #!и добавляет его в _escaped_fragment_параметре запроса). Для более подробной информации, пожалуйста, прочитайте этот блог .

Руби Сайни
источник
По состоянию на октябрь 2017 года это больше не соответствует действительности, этот калькулятор подоходного налога дохода- tax.co.uk построен на чистых AngularJs (даже заголовки похожи на <title> Налоговый калькулятор для £ {{доходSliders.yearly | число: 0}} зарплата </ title>, которая отображается как «налоговый калькулятор за 30000 фунтов стерлингов», и Google индексирует их, ранжирует их на первой странице по сотням ключевых слов. Просто создайте свои веб-сайты для людей, сделайте их потрясающими, а Google позаботится обо всем остальном ;)
Касзони Ференц
0

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

Мое решение: дать сканеру то, что он хочет :

Вы должны подумать о том, чего хочет гусеничный робот, и дать ему только это.

СОВЕТ не связывайтесь со спиной. Просто добавьте небольшой серверный вид спереди, используя тот же API

pykiss
источник