WordPress, FastCGI и редирект 301

Как заставить WordPress посылать код 301 при использовании FastCGI

Всё-таки удивительная штука … Сегодня чисто случайно обнаружил, что если работает в режиме (например, связка  + 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.

Автор: ; опубликовано в: nginx, SEO, WordPress; метки: FastCGI, PHP, redirect, WordPress
5
Мар
2009

RSS Комментарии к статье «WordPress, FastCGI и редирект 301» (14)  »

  1. [...] Более изящное решение, нежели представленное в первой части (WordPress, FastCGI и редирект 301). [...]

  2. [...] подводные камни. Один из них — нежелание WordPress понимать код редиректа, другая — постоянные попытки использовать [...]

  3. 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

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

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

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

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

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

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

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

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

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

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

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

  9. [...] WordPress detects that FastCGI PHP SAPI is in use, it disregards the redirect status code passed to wp_redirect. Thus, all 301 redrects become 302 redirects which may not be good for SEO. [...]

  10. [...] WordPress detects that FastCGI PHP SAPI is in use, it disregards the redirect status code passed to wp_redirect. Thus, all 301 redrects become 302 redirects which may not be good for SEO. [...]

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «WordPress, FastCGI и редирект 301»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

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

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

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

गते गते पारगते पारसंगते बोधि स्वाहा