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

Vladimir
Опубликовано в: SEO, WordPress

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

Всё-таки удивительная штука 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, но это оффтопик).

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

  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.

Добавить в закладки

Связанные записи

5
Март
2009

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

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

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

Подписаться на RSS-ленту комментариев к статье «WordPress, FastCGI и редирект 301» Trackback URL: http://blog.sjinks.org.ua/wordpress/510-wordpress-fastcgi-and-301-redirect/trackback/

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

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

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

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