Описание

Плагин предназначен для решения двух проблем:

  1. Когда WordPress обнаруживает, что используется FastCGI SAPI, код перенаправления, передаваемый в wp_redirect(), игнорируется. Таким образом, все перенаправления с кодом 301 тихо превращаются в перенаправления с кодом 302, что не очень хорошо для SEO.
    Если WordPress работает под управлением nginx, плагин переопределяет функцию wp_redirect(), что позволяет использовать коды перенаправления.
  2. Если WordPress считает, что mod_rewrite (модуль Apache, отвечающий за переписывание URL’ов — используется для красивых постоянных ссылок) не загружен (а nginx не использует модули и API Apache), он предлагает использовать постоянные ссылки в формате PATHINFO (Настройки » Постоянные ссылки). Такие ссылки не очень красивы, но всё же лучше, чем ничего.
    Тем не менее, nginx умеет переписывать URL’ы, но не может об этом сказать WordPress. За него это делает плагин, заставляя WordPress думать, что mod_rewrite всё-таки загружен, и можно использовать красивые пермалинки.

Установка

  1. Загрузите каталог nginx-compatibility в /wp-content/plugins/
  2. Активируйте плагин в панели управления WordPress
  3. Это всё :-) Никакой настройки не требуется, плагин сам обо всём позаботится

Часто задаваемые вопросы

Вопросов пока нет, ответов тоже. Задавайте.

Замечания

GoPHP5! Плагину для работы требуется PHP 5. PHP 4 не поддерживается разработчиками, у меня тоже нет желания его поддерживать. Тем более, что шестая версия на носу.

Домашняя страница плагина на wordpress.org.

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

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

17
Апр
2009

Комментарии к статье «nginx Compatibility» (15)  »

  1. Р_Джинс says:

    А для lighttpd такой плагин написать не желаете ? :)

    • Vladimir says:

      Если Вы согласитесь его тестировать — без проблем (у меня нигде lighttpd не стоит).

      • Р_Джинс says:

        Я бы так сказал, что я его уже заочно тестирую , хотя его еще даже нет :)
        Вернее пока пытаюсь решить проблему отсутствия совместимого с wordpress mod_rewrite в lighttpd доступными способами, но если бы появилась такая , более удобная реализация, то я конечно потестировал бы её, потому как у меня как раз-таки сейчас lighttpd стоит…

  2. Waga says:

    Sorry, I do not speak Russian.

    I downloaded and installed this plugin (version 0.2). Then I turned on permalinks. But when I visit a permalink, Nginx says, “404″.

    This is the FastCGI section in my Nginx configuration. Maybe something is wrong?

    [-]
    View Code nginx configuration
    location ~ \.php$ {
            include /etc/nginx/fastcgi_params;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  /home/luser/public_html/blog.skeleton.com/public/$fastcgi_script_name;

    }

    I am using Nginx 0.7.59

    • Vladimir says:

      No problem, I do speak English.

      As for the configuration, it is not correct. Well, it is but not completely.

      It should look like this (irrelevant blocks omitted):

      [-]
      View Code nginx configuration
      server {
          listen ...;
          server_name ...;

          root /path/to/blog;

          index index.php;

          location / {
              try_files $uri $uri/ @wordpress;
          }

          location @wordpress {
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_param SCRIPT_FILENAME /path/to/blog/index.php;
              include /etc/nginx/fastcgi_params;
              fastcgi_param SCRIPT_NAME /path/to/blog/index.php;
          }

          location ~ \.php$ {
              try_files $uri @wordpress;

              fastcgi_index index.php;
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_param SCRIPT_FILENAME /path/to/blog$fastcgi_script_name;
              include /etc/nginx/fastcgi_params;
          }
      }

      The key is try_files. It is nginx’s counterpart for Apache’s

      [-]
      View Code Apache configuration
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php [L,QSA]

      When you access http://example.com/my/permalink, nginx:

      1. Tries to find /my/permalink file;
      2. If that fails, it looks for /my/permalink/ directory;
      3. If that fails, it goes location @wordpress section which instructs it to use index.php and sets the correct SCRIPT_NAME (otherwise, All in One SEO Pack will bail out with fatal error). index.php looks at $_SERVER["REQUEST_URI"] and handles all permalink stuff.

      Also please note the absense of the leading slash in fastcgi_param before $fastcgi_script_name: $fastcgi_script_name already contains that slash (e.g., /index.php) and there’s no need to duplicate it.

      Hope that helps.

      • Waga says:

        Wow, I think your English is better than mine!

        Thank you very much for the fast response. There are many guides on nginx and wordpress, but many don’t have good explanation.
        It’s good to see you posted code which works, and then a explanation of how it works.

        I used the examples provided, and now permalinks work fine. Even though I didn’t enable your plugin yet. Is this code supposed to make the plugin unneeded, or should I turn it on still?

        Thank you again for the big help!

        • Vladimir says:

          You are always welcome.

          Is this code supposed to make the plugin unneeded, or should I turn it on still?

          If you just need to have working permalinks, you don’t have to enable the plugin. However, if you are concerned about SEO, you should probably activate the plugin.

          When WordPress performs a redirect (using its wp_redirect() function) it always sends 302 response code even if 301 (which transfers PR) should be used.

          Basically the plugin tricks WP into thinking that the server has the same capabilities as Apache (say, it supports pretty permalinks instead of PATHINFO, correctly interpretes 301 redirect etc) thus making WP enable all fetaures it disables when not running in Apache server.

          • Waga says:

            Oh I remember now. You said about the redirects on the plugin page. Sorry!

            Thanks for explain to me again!

  3. w3wsrmn says:

    Thanks for this plugin!

    Getting permalinks to work with Wordpress on nginx isn’t much of a hassle, but I was disappointed to see redirects returning a 302. I wasn’t aware Wordpress would drop the redirect status code when PHP is running as CGI. Your plugin works exactly as described: “install and forget.”

  4. SeoNizator says:

    Поясните, плз. Этот плагин в любом случае полезен, или только когда апач с в связке с nginx?
    Собсно как определить насколько необходимо его использование на конкретном хостинге?

    • Vladimir says:

      Смотря какой из серверов занимается обработкой PHP. Если nginx — то да, если Apache — то нет.

      Как определить — посмотрите, какую структуру постоянных ссылок предлагает WordPress. Если PATHINFO (/index.php/something/else) — то нужен. Ну или посмотрите, выполняется ли редирект с кодом 301.

  5. curt says:

    Добрый день. Я приехал из отпуска. И вдруг обнаружил на своем вордпрессе проблему. При входе в админку я вижу предупреждение

    Warning: Cannot modify header information - headers already sent by (output started at /var/www/wp-load.php:55) in /var/www/wp-content/plugins/nginx-compatibility/nginx-compatibility.php on line 66

    Когда я изменяю имя папки с вашим плагином, чтобы отключить его, я вижу следующее

    Warning: Cannot modify header information - headers already sent by (output started at /var/www/wp-load.php:55) in /var/www/wp-includes/pluggable.php on line 865

    там определяется функция:

    [-]
    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
    /*865 ->*/  header("Location: $location");
        }
    }

    попробовал на угад закомментировать эту ветку кода

    [-]
    View Code PHP
    // else {
        //      if ( php_sapi_name() != 'cgi-fcgi' )
        //          status_header($status); // This causes problems on IIS and some FastCGI setups
        //      header("Location: $location");
        //  }

    после чего, админка совсем не грузится, ни какого кода вордпресс в ответ вообще не отдает.
    Что сделать с этим - не знаю… помогите пожалуйста… Какие могут быть варианты?
    Конфиг: Gentoo + Nginx + PHP5 + MySQL5

    • curt says:

      Не знаю что за проблема была. Помогло обновиться до версии 2.8.4 с версии 2.8.2

    • Vladimir says:

      curt, в сообщении об ошибке ясно сказано: output started at /var/www/wp-load.php:55.

      Что-то не того в 55 строке в Вашем wp-load.php было. Возможно, пустая строка или вывод текста.

Подписаться на RSS-ленту комментариев к статье «nginx Compatibility» Trackback URL: http://blog.sjinks.org.ua/wordpress-plugins/nginx-compatibility/trackback/

Оставить комментарий к записи «nginx Compatibility»

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

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

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