Как стать автором
Обновить

Комментарии 93

Просьба к людям людям сливающим мне карму и минусующим топик, объяснить с чем связана такая реакция?
Я не могу сказать за тех кто минусовал, я не минусовал. Но вот подумайте, о чём ваша статья. Вот мы тут делали, делали и у нас не получилось? Ну и что? В чём новизна и интерес-то?
Новизна в том, что Google официально отказались от SSR, а в интернете все еще нету никаких фидбэков на эту тему. Мы, как компания с относительно большим и серьезном сайтом, наступаем на эти грабли и даем вам фидбэк, бесплатно.
Не минусовали, но фидбэк все же хотелось бы видеть в виде «проверили, реально с яваскриптом проблема у гугла, доказано так-то так-то и так-то» или даже "(то же самое) + проблема решается так-то и так-то", а у Вас лишь «попробовали обойтись без SSR, появились некоторые проблемы, с чем связано непонятно»:)
Спасибо за ссылку на вики, объясняющая нерадивым умам, что такое одностраничный сайт. Благодарен за полезную статью, как только будет необходимость обращаться к drupal как rest сервису..., сразу же обращусь к этой статье, прямо по шагам буду идти.
Человек поделился своим опытом. Сегодня многие делают SPA, вот что бы они не делали таких ошибок он и написал.
Хотя согласен что не хватает продолжения и счастливого конца )
Вспомните ошибку выжившего, читать сплошные success-story не особо полезно, порой куда интересней взглянуть на тех у кого не взлетело.
Спасибо за интересный фидбек. Гугл вообще ведёт себя непонятно, сначала они выпускают фреймворк для того что бы на нём что то пилили, а потом своим алгоритмом индексирования — убивают весь смысл использовать его для создания сайтов требующих SЕО. Тоесть по факту дла SPA остаються только админки, приложения на phoneGap и какие то комерческие системы чисто для автоматизации внутренней кухни у коркретных заказчиков. Можно конечно не смотря ни на что — делать сайты на ангулялре, но я ещё не видел людей которые были готовы вот так вот пожертвовать SEO ради того, что бы сайт был SPA.
Prerender.io наверное дешевле выйдет чем откат назад.

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

А, собственно, в чем проблема сделать SSR на NodeJS? Берем phantomjs, и если в адресе есть _escaped_fragment_=, то прогоняем текущий адрес через phantomjs, убираем оттуда все JS скрипты и выдаем гуглу/яндексу/etc. Это же работы на час, максимум?
У нас проблемы нету. Просто Google больше не рекомендует этот способ.
Ну так можно же сделать SSR, а когда гугл научится окончательно хавать SPA, то убрать?

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

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

Как я уже сказал ранее, мы решили не делать SSR не потому что мы не можем, а по тому что Google сам отказался это этого метода. И мы решили попробовать скормить наш сайт без SSR. И выяснили что на сегодняшний день лучше все-таки использовать SSR.
Ну у нас задачи немного разные :) Мы делали это больше для соц. сетей, нежели для гугла. А так, да. Отдаем лендинг как HTML страничку, без всяких там SPA.
На сколько мне известно, Facebook не понимает JS, и для него нужно дополнительно отрисовывать странички.
Разве отдача разного контента для разных User-Agent не считается клоакингом?

Не для разных User-Agent, а для разных _escaped_fragment_=. Мы так делали, всё отлично индексируется разными поисковиками. Более того, сайт давно мёртв, а ссылки всё ещё в индексе :-)

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

И что? Он как работал так и будет работать. Причём работает он не только с гуглом. А если гугл когда-нибудь и выпилит его поддержку — ничего не сломается.

Да собственно ничего)
У меня есть сайт на angular работающий на данном способе. Но сейчас, с приходом react'а, я предпочитаю пререндерить страницу не только для SEO, но и для пользователей (что имеет свои плюсы). При этом например метод с _escaped_fragment_ не понимали боты соц. сетей и для них приходилось городить определение по user-agent'у на уровне nginx'a и перенапрявлять на тот же _escaped_fragment_.
В общем я за простоту, особенно если спека помечена как deprecated)
Полезная, правильная статья. Человек описал свой опыт, явно неудачный. Тема важная. Очень хотелось бы получить комментарий от представителей гугла, иначе, к сожалению, так и остается непонятным, как же все-таки правильно отдавать результат поисковику.
Для нас — единственный. Суммарный трафик со всех остальных поисковиков менее 1%.

Есть вы оптимизируете сайт исключительно под один поиск, то не удивительно, что через остальные вас попросту не находят. А после отказа от SSR вы и этих 4к пользователей в месяц потеряете.

400k

Спасибо за ссылку. Да, это верно насчет гугла. Но все-таки это какая-то, извините, лажа получается. Допустим, я делаю одностраничный сайт, наполнение которого в браузере происходит ТОЛЬКО за счет JS. Ну как с ангуляром, загружаем данные, обновляем модель. Но вот же ж — поисковики не могут все это прочитать. И что тогда, вся эта прекрасная технология MVVM псу под хвост, потому что надо чтобы сайт индексировался или же приделывать какие-то костыли в виде дополнительного рендеринга только для поисковиков?
Тут важно все разбить на страницы. Чтобы определенный контент показывался по определенным страницам.
Если все будет в одной куче — Google Crawler не поймет как это индексировать.
{
«status»: 301,

}

Зачем этот костыль? Есть же стандартные коды состояний HTTP.
Это не костыль, а статус запрашиваемой страницы. Я у backend спрашиваю состояние страницы, и он мне отвечает. Если backend мне вернет 503 — это будет означать что backend мертв, а не запрашиваемая страничка мертва.
Если не понятно — могу подробнее объяснить.
Если честно, больше всего мне непонятно, зачем вообще в этой схеме nodejs. Только для того, чтобы отдавать стартовый index.html и редиректить?
Для того чтобы отрабатывать редиректы, 404 и стримить недостающие файлы с бэкэнда.

все это может продолжать делать друпал в режиме апи

Нет, не может.


  1. У друпала слишком медленная инициализация, для того чтобы просто вернуть статику.
  2. Я не могу перегружать существующие адреса, т.к. они используются для модерации контента.
Почему не делать отдачу статики и редирект со старых роутов на новые через nginx?

Я уже тут где-то отписал, по тому что у нас нету прямого доступа к серверам. Мы используем Heroku и Pantheon.

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

Насколько я знаю, гугл хорошо умеет индексировать js сайты, но с одним условием, он не ждёт результатов ajax запросов. Поэтому если первичные данные для отрисовки любой страницы вы подтягиваете ajax'ом — гугл пройдёт мимо.
А как иначе, если не подгружать данные? Это уже не JS сайт получается.
данные уже нужно подгрузить вместе с хтмл и использовать в виде
<script>
window.initialData = {};
</script>


Но естественно на каждую страницу не хочется в бекэнде прописывать какие данные должны быть в хтмл. Я решил эту проблему путём проверки вида запроса при обращении к странице, если запрос ajax — значит это реальный пользователь ходит туда сюда по сайту, если запрос get — значит это поисковик, соотвественно когда это поисковик, я запускаю phantomjs он идёт по этому же адресу (по user agent исключаем рекурсию) и ждём скажем 3 секунды, после этого ответ отдаём гуглу. По идее за три секунды все ajax'ы должны были отработать.
Правда если обычный человек зайдёт сразу на внутреннюю страницу, ему придётся ждать 3 секунды. Можно попробовать по user agent гугл ботов такую логику делать.

Если данные передавать уже вшитыми в страницу, тогда эта страница будет очень долго отдаваться. Весь смысл перехода на JS пропадает.

Если оптимизируете SQL запросы, то оверхед не будет превышать 10мс.

А если все на ассемблере переписать, то ваще быстро будет.

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

Вовсе нет. Если данные отдельно подгружать, их можно закешировать как статику и положить в CDN. Что мы собственно и сделали.


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

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

Мы уже экспериментировали с тем методом, что Вы описали. Вот допустим здесь, одна из самых нагруженных наших страниц. Все комментарии загружаются прям в страницу, и потом отрисовываются через angularjs.

Он ждет. Но робот ограничен в этом ожидании, как и в оперативной памяти. Может часть высоконагруженной страницы просто недорендерить. Или не дождаться ответа от медленного АПИ. В общем черный ящик.

Да, очень может быть. Мы заметили что у нас некоторые страницы попали в индекс, а некоторые нет. Вы не вкурсе какие ограничения у бота?

Интересный опыт. Не понял только зачем гонять картинки и sitemap.xml через node.js. У вас же наверняка наружу смотрит nginx, который может это делать лучше и с помощью конфигурации, без лишних строк кода.

К сожалению, у нас ни на backend ни на frontend нету прямого доступа к серверам. На frontend используется Heroku а на backend — Pantheon.

Что такое v1 в robots.txt?

Это разрешение поисковым роботам на доступ к адресам вида /v1/*
Этот префикс мы используем для REST API.

А зачем индексировать api, это же программный интерфейс, а не человекочитаемый контент, за которым приходит гугл.

Если запретить api в robots.txt то Google бот не сможет загрузить данные для странички.

Это проверенная информация или гипотеза?
Я вот, полагал, например, что сферический бот в вакууме, он да — при заходе на сайт ищет все ссылки и пытается их открыть, честно учитывая то что в robots.txt,
Но когда у поисковиков пошёл тренд на поведенческие факторы, SPA, AJAX и т.п. я представлял себе, что они со своей стороны открывают страницу неким юзер-агентом приближенным к полноценному, которому, разумеется до robots.txt нет дела, если часть контента получается через AJAX.

Да, это проверенная информация. Google Search Console ругается на это, если заблокировать, и страницу на предпросмотре показывает без данных.

Вот мы тоже повелись на это сообщение Гугла и даже проверили в Search Console что он сайт полностью показывает. А по факту оказалось, что он все равно только голый HTML индексирует. Пришлось в срочном порядке прикручивать prerender.io

Да, он там нам тоже все красиво показывает :)

На каждый запрос пользователя на новую версию вы внутри делаете https запрос на старую версию, чтобы вытянуть информацию по редиректам?
При этом у вас response time для PHP в районе 70ms. Сколько времени из этого занимает https-запрос к старому бекенду за редиректом?

Верно, каждый запрос пользователя посылает запрос на старый backend. Единственное что, первый запрос делается с node.js для того чтобы отработать HTTP status code. Остальные запросы будут уходить с клиента.


Сколько времени занимает https-запрос я сказать не могу, т.к. мы все это кэшируем в CloudFlare, и запрос на прямую не проходит. А он там уже по своему распределяет кэш по миру.

Статья свежая — значит самое время начать переписывать на Angular2, там с SEO в смысле сервер-сайд рендеринга все намного лучше

А angular 2 уже зарелизился?

Еще нет. Более того, там штатного SSR не было 2 месяца назад. Есть сторонее решение, но я его не проверял пока.
нет, пока в RC1. но если вы говорите что первую версию пол-года пилили, то сейчас как раз можно начинать

Мы ее делали на компонентах 1.5, так что мы готовимся к предстоящему обновлению. Как зарелизится 2.0 — так начнем, при условии что мы заставим Google индексировать наш контент.

У нас был API на php и фронтенд на ангуляре, то того момента пока это была исключительно админка для клиентов компании, вопроса о поисковиках вообще не стояло. А вот когда нужно было сделать публичный фронтенд к API, который бы индексировался поисковиками, решили сделать прототип с SSR на node.js + react.js. Суть в том что если юзер агент не может js, не зависимо от того краулер это или браузер, в котором отключили js, то все рендерится на сервере. Если же в браузере включен js, то пользователь работает с нормальным SPA.
Как результат, яндекс и гугл проиндексировали все страницы, которые предполагались. Сайтик, который строит сайтмап автоматом, тоже без проблем это прожевал.
За основу для прототипа брали вот эту репу github.com/erikras/react-redux-universal-hot-example

А как вы в версии без JS сделали авторизацию?

Вопрос интересный ) На самом деле в прототипе пока никак, и не уверен что мы это будем делать, т.к. все-таки не предполагается что юзер будет полноценно работать с выключенным JS. Но если это очень надо, то ведь сабмит формы работает и без JS, так что я думаю особых проблем тут не будет.
Тогда придётся поддерживать две версии сайта, с JS и без. Для сабмитов надо будет ещё второстепенные страницы создавать.
А как вы определяли на уровне запроса идет он с js или без?
Если запрос пришел на бэк node.js, то значит у клиента нет js (или это первое обращение к сайту), рендерим все на сервере (используя нужные данные от API) и отдаем. Если же у клиента есть js, то все запросы будут уходить с фронта сразу к API, минуя бэкенд на node.js

NodeJS у вас выполняет презентационную функцию, а значит является фронтендом. А вот то, что вы называете "API" — и есть бэкенд.

После недели тестирования трафик на сайт упал на 30%

После отката трафик вернулся?
Пока ещё нет. Но он перестал падать. Мы ещё следим за этим, на следующей неделе отпишу.
Как вариант — можно использовать вот эту разработку для поддержания SPA и HTML-static версии: prerender.io
Тут стоит отметить, что если использовать CNAME записи, то замена сервера произойдет мгновенно. Запись A будет рассасываться по DNS до 48 часов.

С чего бы это? Сколько ни вдумываюсь — не понимаю, в чём эффект: у каждой записи свой TTL (который подействует при следующем обновлении), откуда же у вас уверенность, что CNAME обновляется быстрее?

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


Если делать тоже самое с ALIAS, при том же TTL, то это занимает какое-то время.

Лично мне статья показалась полезной в виду того, что информации по этой теме не так много. Веб приложения набирают популярность, а гугл не особо спешит их воспринимать. Сам столкнулся с этим, так пока и не нашел решения для себя. Пререндер выглядит уж больно временным решением, не хочется на нем концентрироваться. В идеале бы поторопить поисковики :) В общем спасибо за описание вашего опыта!
Если не секрет, какое решение вы нашли?
Мой проект написан на MeteorJS (https://github.com/InstaPhobia/instaphobia.com), я поставил сео-плагин, который генерирует мета-данные для страниц. По описанию и отзывам он вроде бы должен читаться как минимум гуглом, но в итоге на данный момент гугл в поиске показывет title, а description пустой. Так что, можно сказать, что я не нашел пока решение… Но на своем опыте тоже убедился, что с обработкой поисковиками одностраничных приложений пока «все не так прозаично» (см. «Да Здравствует Цезарь»), как они утверждают…
Спасибо за ответ. Вот ведь фигня. Одностраничным приложениям сто лет в обед, а поисковики упорно их игнорируют.
Получается, что так. Но по ощущениям, приложения должны быть еще популярнее со временем. Так что надеюсь, гугл тоже будет работать над этим. А там глядишь и Яндекс.
Учитывая тренды веб приложений, без SPA будет всё труднее обойтись, там глядишь и поисковики проснуться, начав решать нашу проблему более активно.

Мы тоже вставляем meta tags динамически через js. Попробуйте рисовать странички быстрее 5 секунд, я думаю это поможет.


У нас все странички рисуются одинаково, разница лишь во времени отрисовки. И какие-то страницы все-таки попали в индекс, во всеми meta tags.

Спасибо, есть пища для размышлений. Буду экспериментировать.)
что же за спа у вас такой. За 5 секунд страницу не отрендить. Мда…

Это не только от фронтенда зависит.

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

и меня тоже эти вопросы интересуют

В конце концов мы добавили Prerender.io, и после того как убедились что трафик идёт как прежде и Гугл индексирует нас — заменили Drupal на nodejs.


К этому времени angularjs 1.6 устарел и мы переписали фронтенд на react.


Затем мы поняли что существует gatsbyjs и заменили REST бэкенд на простую генерацию статики.


Жить стало намного проще и я уволил себя с этой компании и пошёл работать в другую :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории