Vladimir Kolesnikov Меня зовут Владимир, я программист-фрилансер (PHP, Node.js, C/C++, Qt). Ещё занимаюсь администрированием серверов и техническим переводом. Крестиком вышивать не умею.
Мар 052009
 

Всё-таки удивительная штука … Сегодня чисто случайно обнаружил, что если работает в режиме (например, связка WordPress + nginx + PHP), то все редиректы с кодом 301 (Permanent ) превращаются в редиректы с кодом 302 (Temporary ).

Чем это грозит? Если Вы занимаетесь спамомSEO, то Вы, вероятно, знаете, что переход с кодом 302 не передаёт PageRank. Иными словами, если Вы изменили структуру пермалинков или по той или иной причине в Google "раскручена" страница с несколько другой постоянной ссылкой (например, http://example.com/?p=202), то «канонический редирект» (см. wp-includes/canonical.php) не передаст PageRank целевой странице.

Еще раз повторюсь, это актуально только в случае использования PHP в режиме FastCGI (и для IIS, но это оффтопик).

Есть два способа решения проблемы:

  1. Написание плагина, реализующего свой вариант wp_redirect() (функция wp_redirect() определена в wp-includes/pluggable.php, что даёт возможность её переопределения);
  2. Изменение кода wp_redirect() в wp-includes/pluggable.php

Я рассмотрю только второй вариант.

В оригинале функция wp_redirect() выглядит следующим образом:

[-]
View Code PHP
function wp_redirect($location, $status = 302) {
        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.

Должно получиться что-то вида:

[-]
View Code PHP
function wp_redirect($location, $status = 302) {
        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.

  16 Ответов в “WordPress, FastCGI и редирект 301”

Comments (10) Pingbacks (6)
  1. Before I used Nginx my links like, www.example.com/postname.html but if I use Nginx, I only can use www.example.com/postname, can you help me make my links like www.example.com/postname.html?

    Thank you

  2. Всё вышеописанное понятно, в плане что куда вставить. Я тут, правда, недавно начал изучать PHP и поэтому попытаюсь разобраться в коде. Спасибо автору.

  3. подскажите, плз, как узнать – какой редирект срабатывает в вордпрессе в моём конкретном случае ?

    яндекс не индексирует страницы моего сайта вида site.ru/post

    при запросе текста с тех страницы в ПС – показываются страницы вида site.ru/tags/post
    такой страницы на сайте не было и нет, но при вводе в браузер (или переходе из ПС) – происходит редирект на site.ru/post

    вроде бы похоже на случай описанный вами в этом посте

    на хостинге fastcgi, включен плагин суперкеш

    сейчас закоментил строчку как у вас описано, хочется как то проверить – исправился ли именно мой редирект

  4. там именно tags а не tag (как было бы в случае с метками), поэтому вообще странно откуда Яндекс взял такие УРЛ

    моя цель, чтобы в индекс Яндекса попали нормальные – “правильные” урлы

  5. спасибо, исправил
    проблемка была на обоих блогах

  6. А какой все таки метод лучше, есть какие то минусы у первого варианта?

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.

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

(обязательно)

(обязательно)

Вы можете использовать эти HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя