Всё-таки удивительная штука WordPress… Сегодня чисто случайно обнаружил, что если PHP работает в режиме FastCGI (например, связка WordPress + nginx + PHP), то все редиректы с кодом 301 (Permanent Redirect) превращаются в редиректы с кодом 302 (Temporary Redirect).
Чем это грозит? Если Вы занимаетесь спамомSEO, то Вы, вероятно, знаете, что переход с кодом 302 не передаёт PageRank. Иными словами, если Вы изменили структуру пермалинков или по той или иной причине в Google "раскручена" страница с несколько другой постоянной ссылкой (например, http://example.com/?p=202), то «канонический редирект» (см. wp-includes/canonical.php) не передаст PageRank целевой странице.
Еще раз повторюсь, это актуально только в случае использования PHP в режиме FastCGI (и для IIS, но это оффтопик).
Есть два способа решения проблемы:
- Написание плагина, реализующего свой вариант
wp_redirect()(функцияwp_redirect()определена вwp-includes/pluggable.php, что даёт возможность её переопределения); - Изменение кода
wp_redirect()вwp-includes/pluggable.php
Я рассмотрю только второй вариант.
В оригинале функция wp_redirect() выглядит следующим образом:
global $is_IIS;
$location = apply_filters('wp_redirect', $location, $status);
$status = apply_filters('wp_redirect_status', $status, $location);
if ( !$location ) // allows the wp_redirect filter to cancel a redirect
return false;
$location = wp_sanitize_redirect($location);
if ( $is_IIS ) {
header("Refresh: 0;url=$location");
} else {
if ( php_sapi_name() != 'cgi-fcgi' )
status_header($status); // This causes problems on IIS and some FastCGI setups
header("Location: $location");
}
}
Всё, что требуется — закомментировать строку if ( php_sapi_name() != 'cgi-fcgi' ). При этом не забываем прочитать комментарий разработчиков: This causes problems on IIS and some FastCGI setups
.
Должно получиться что-то вида:
global $is_IIS;
$location = apply_filters('wp_redirect', $location, $status);
$status = apply_filters('wp_redirect_status', $status, $location);
if ( !$location ) // allows the wp_redirect filter to cancel a redirect
return false;
$location = wp_sanitize_redirect($location);
if ( $is_IIS ) {
header("Refresh: 0;url=$location");
} else {
// if ( php_sapi_name() != 'cgi-fcgi' )
status_header($status); // This causes problems on IIS and some FastCGI setups
header("Location: $location");
}
}
Не забываем сохранить файл, после чего редиректы с кодом 301 останутся редиректами с кодом 301
UPDATE: для nginx есть лучший способ: плагин nginx Compatibility.
Меня зовут
Before I used Nginx my links like,
www.example.com/postname.htmlbut if I use Nginx, I only can usewww.example.com/postname, can you help me make my links likewww.example.com/postname.html?Thank you
Please take a look at these configurations. They do allow
postname.htmllinks.Всё вышеописанное понятно, в плане что куда вставить. Я тут, правда, недавно начал изучать PHP и поэтому попытаюсь разобраться в коде. Спасибо автору.
подскажите, плз, как узнать – какой редирект срабатывает в вордпрессе в моём конкретном случае ?
яндекс не индексирует страницы моего сайта вида site.ru/post
при запросе текста с тех страницы в ПС – показываются страницы вида site.ru/tags/post
такой страницы на сайте не было и нет, но при вводе в браузер (или переходе из ПС) – происходит редирект на site.ru/post
вроде бы похоже на случай описанный вами в этом посте
на хостинге fastcgi, включен плагин суперкеш
сейчас закоментил строчку как у вас описано, хочется как то проверить – исправился ли именно мой редирект
У Вас сейчас 302 редирект.
там именно tags а не tag (как было бы в случае с метками), поэтому вообще странно откуда Яндекс взял такие УРЛ
моя цель, чтобы в индекс Яндекса попали нормальные – “правильные” урлы
У Вас в robots.txt sitemap указывает на thesound.ru, а не на 35metod.ru. Попробуйте исправить.
спасибо, исправил
проблемка была на обоих блогах
А какой все таки метод лучше, есть какие то минусы у первого варианта?
А какой больше нравится. Мне лично больше плагин по душе, ибо не сломается при обновлении.
Leave a comment below if you dare
If by accident you see this form, please do not use it; use the form below this instead.