WordPress, Яндекс, редирект 301, зеркала www и без www

19 Фев
2009

Кажется я нашел решение проблемы.

Сначала, вкратце, о чем вообще речь. Допустим, у вас есть блог с адресом www.kakoy-to-blog.ru. И в один прекрасный день Вы решили, что в адресной строке браузера kakoy-to-blog.ru выглядит лучше без www. Меняем через общие настройки WordPress URL блога, и вуаля, со всех адресов с www идет редирект на адреса без www. Дальше начинаются проблемы. Если Гуглу можно просто сказать,что сайт нужно индексировать без www, то наш убогий любимый Яндекс начинает всячески гнобить Ваш блог.  Страницы начинают пропадать из индекса Яндекса, пока в конце-концов не остается куцая главная страница по старому адресу с www без описания. Почему так происходит? Все довольно просто – Яндекс продолжает считать главным зеркалом Вашего сайта адрес www.kakoy-to-blog.ru, а kakoy-to-blog.ru просто ненужным придатком. Согласно официальному описанию, чтобы этого не происходило, необходимо создать файл robots.txt в корневом каталоге сайта и прописать там для Яндекса директиву Host. В итоге robots.txt для него может выглядеть примерно так:

User-agent: Yandex
Disallow:
Host: kakoy-to-blog.ru

Но это, как оказалось только начало пути. Для Яндекса директива Host является лишь рекомендацией, и может не соблюдаться, кроме того время “склейки” зеркал занимает от 4 до 6 недель, а в некоторых случаях по непонятным причинам не происходит вовсе. Интересно, Лебедев про это убожество знает? В моем случае, после трех месяцев мурыженья Яндексом, я решил, что ожидание слишком затянулось. Предложенное Иваном Ширко решение этой проблемы мне не понравилось – он предлагает, по сути, просто вырубить все редиректы WordPress, заменив их редиректами в htaccess. Сразу возникают две проблемы: во-первых, Яндекс не может забрать robots.txt, поскольку он лежит не на том домене, а во-вторых, на сайте возникает в поисковых индексах возникает множество дублирующих друг друга страниц – с www и без www, со слэшем на конце и без него и прочие. Кроме того, один из ответов техподдержки Яндекса выглядит следующим образом:

Передача эффекта ссылок при склеивании зеркал

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

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

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

Страницы с серверным редиректом удаляются из базы – http://webmaster.yandex.ru/faq.xml?id=502499#redirect. Эффект ссылок передаваться не будет.

Таким образом, задача заключается в следующем:

1) сделать так, чтобы Яндекс мог читать страницы по старым адресам

2) при этом, все внутренние ссылки должны указывать на нужное зеркало сайта

3) и должны сохраняться остальные редиректы WordPress

Я решил эту проблему достаточно грубо. но, вроде бы, эффективно: в файле wp-includes/canonical.php (это на WordPress 2.7, на более старых версиях вроде бы нужно редактировать wp-includes/functions.php) в функции redirect_canonical нужно найти строчки

if ( !empty($user_home['host']) )
		$redirect['host'] = $user_home['host'];

и строчки

if ( strtolower($original['host']) == strtolower($redirect['host']) ||
		( strtolower($original['host']) != 'www.' . strtolower($redirect['host']) &&
 'www.' . strtolower($original['host']) != strtolower($redirect['host']) ) )
		$redirect['host'] = $original['host'];

и закомментировать их (добавить /* до них и */ после них). У меня эти строчки идут на 196 и 254 строке canonical.php. В результате WordPress будет отдавать страницы и по старым адресам, но все ссылки будут вести на новые адреса. Можете попробовать: работает и http://www.chetvericov.ru/zametki/naskolko-nuzhen-mozg-dlya-zhizni-cheloveka/, и  http://chetvericov.ru/illyuzii/fokus-s-izcheznoveniem-slepota-vyzvannaya-dvizheniem/.

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

Заметки на близкие темы

5 комментариев к заметке WordPress, Яндекс, редирект 301, зеркала www и без www

Комментарии на сайте

SeoMazzi пишет:

Интересно, а как победить редирект 301 со страниц типа http://www.site.ru/razdel/ на http://www.site.ru/razdel. Первого варианта вообще нет на моем сайте, но яндес его как-то нашел

Не совсем понимаю, зачем Вам это нужно, ведь тогда будут дубликаты страниц, а так яндекс их рано или поздно нормально проиндексирует.
Можете попробовать закомментить строку
$redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type);
это должно все редиректы со слэшами победить.
(или добавить перед ней if ($user_ts_type!='category')

SeoMazzi пишет:

Проблема в том, что у меня нет линков со слешем в конце. Но яндекс считает иначе за что получает 301. А я еще одну ошибку в консоль вебмастера

Да, фигня какая-то. Я порылся у себя в консоли и обнаружил, что мало того, что есть пара страниц с 301 ошибкой из-за слеша, так еще и есть проиндексированные без слеша страницы, что для меня совсем непонятно.

SeoMazzi пишет:

Спрашивал на серче – ответа нет.

http://forum.searchengines.ru/showthread.php?t=340461&page=5

Написал в саппорт Яндекса может ченить сдвинется. Хотя мне кажется, что это просто бага яндекса как инструмента.

Оставить комментарий

Если у Вас есть ЖЖ (LiveJournal), достаточно указать его в поле сайт.

top