Замена RewriteRule в nginx, для различных CMS

Итак, имеем веб сервер nginx в качестве фронтэнда, на бакэндах apache и какой-нибудь fastcgi (spawn-fcgi или php-fpm). Функциональные возможности серверов, nginx и apache, несколько различаются, и одно из различий как раз в том, что nginx не поддерживает обработку файлов htaccess, которые в apache используются практически повсеместно. Большинство сайтовых движков (CMS), поддерживают возможность генерировать так называемые ЧПУ(человекопонятный урл, в оригинале, SEF - search engines friendly url), но для этого, веб сервер, должен обрабатывать строку запроса определенным образом, что apache и делает с помощью mod_rewrite и правил в файле htaccess. Задача: заменить правила htaccess, соответствующими директивами в конфигурационном файле nginx.

Приведу несколько вариантов, для распространенных движков.
Все приведенные ниже варианты, рабочие, настроены и проверены на сервере под управлением операционной системы FrereBSD 7.1, версия Nginx 7.59.

Данные настройки касаются стандартных SEF модулей, встроенных в движки.
во всех примерах подразумевается, что версия nginx поддерживает именованные location и директиву try_files

Конфигурация Nginx и Apache для Joomla 1.0.15

Правила htaccess:

  1. RewriteBase /
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. ## RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] 	 ## опционально ##
  5. RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$  [NC]
  6. RewriteRule ^(content/|component/) index.php

Эквивалент для настройки сервера nginx

  1.  location / {
  2.     index index.php index.html index.htm;
  3.  }
  4.  
  5. ## в поставляемом с дистрибутивом, файле htaccess, есть опциональная строка, по-умолчанию закомментирована 
  6. ## данный блок ее эквивалент для nginx 
  7. #
  8. # location ^~ /component/option,com {
  9. #    index index.php index.html index.htm;
  10. #    try_files $uri $uri/ @joomla;
  11. # }
  12. #####
  13.  
  14. location ~* (\.html?|/|/[^.]*)$ {
  15.    try_files $uri $uri/ @joomla;
  16.    index index.php index.html index.htm;
  17. }
  18.  
  19. location ~ \.php$ {
  20.    try_files $uri @joomla;
  21.    fastcgi_pass   unix:/tmp/php-fpm.sock;  ## Ваш fastcgi сервер 
  22.    fastcgi_index  index.php;
  23.    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  24.    include        fastcgi_params;          ## стандартный файл, идущий с nginx 
  25. }
  26.  
  27. location @joomla {
  28.    fastcgi_pass   unix:/tmp/php-fpm.sock; 
  29.    fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
  30.    include        fastcgi_params; 
  31. }

Конфигурация Nginx и Apache для Joomla 1.5.10

Правила htaccess:

  1. RewriteBase /
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_URI} !^/index.php
  5. RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
  6. RewriteRule (.*) index.php
  7. RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

Эквивалент для настройки сервера nginx

  1. location / {
  2.    index index.php index.html index.htm;
  3. }
  4.  
  5. location ~* (/|\.html?|\.feed|\.pdf|\.raw|/[^.]*)$ {
  6.    try_files $uri $uri/ @joomla;
  7. }
  8.  
  9. location ~ \.php$ {
  10.    try_files $uri @joomla;
  11.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  12.    fastcgi_index  index.php;
  13.    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  14.    include        fastcgi_params;
  15. }
  16.  
  17. location @joomla {
  18.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  19.    fastcgi_param  SCRIPT_FILENAME      $document_root/index.php;
  20.    fastcgi_param  QUERY_STRING         $query_string;
  21.    fastcgi_param  REQUEST_METHOD       $request_method;
  22.    fastcgi_param  CONTENT_TYPE         $content_type;
  23.    fastcgi_param  CONTENT_LENGTH       $content_length;
  24.    fastcgi_param  REDIRECT_STATUS      200;
  25.    fastcgi_param  SCRIPT_NAME          /index.php; 
  26.    fastcgi_param  REQUEST_URI          $request_uri;
  27.    fastcgi_param  DOCUMENT_URI         $document_uri;
  28.    fastcgi_param  DOCUMENT_ROOT        $document_root;
  29.    fastcgi_param  SERVER_PROTOCOL      $server_protocol;
  30.    fastcgi_param  GATEWAY_INTERFACE    CGI/1.1;
  31.    fastcgi_param  SERVER_SOFTWARE      nginx/$nginx_version;
  32.    fastcgi_param  REMOTE_ADDR          $remote_addr;
  33.    fastcgi_param  REMOTE_PORT          $remote_port;
  34.    fastcgi_param  SERVER_ADDR          $server_addr;
  35.    fastcgi_param  SERVER_PORT          $server_port;
  36.    fastcgi_param  SERVER_NAME          $server_name;
  37. }

Примечание: в первом примере, fastcgi_param были загружены из стандартного файла, идущего в поставке nginx, во втором, я не стал инклудить файл с параметрами а просто прописал их в конфиг, обратите внимание что параметр SCRIPT_NAME, отличается от первого примера.

Конфигурация Nginx и Apache для Wordpress 2.7.1

Правила htaccess:

  1. RewriteBase /
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteRule . /index.php [L]

Эквивалент для веб сервера nginx

  1. location / {
  2.    try_files $uri $uri/ @wordpress;
  3.    index index.php index.html index.htm;
  4. }
  5.  
  6. location ~ \.php$ {
  7.    try_files $uri @wordpress;
  8.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  9.    fastcgi_index  index.php;
  10.    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  11.    include        fastcgi_params;
  12. }
  13.  
  14. location @wordpress {
  15.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  16.    fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
  17.    include        fastcgi_params;
  18. }

Как видите, тут мы тоже просто инклудим стандартный файл с fastcgi параметрами

Конфигурация Nginx и Apache для Drupal 6.12

Правила htaccess:

  1.   RewriteCond %{REQUEST_FILENAME} !-f
  2.   RewriteCond %{REQUEST_FILENAME} !-d
  3.   RewriteCond %{REQUEST_URI} !=/favicon.ico
  4.   RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Эквивалент для сервера nginx

  1. location / {
  2.    try_files $uri $uri/ @drupal;
  3.    index index.php index.html index.htm;
  4. }
  5.  
  6. location ~ \.php$ {
  7.    try_files $uri @drupal;
  8.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  9.    fastcgi_index  index.php;
  10.    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  11.    include        fastcgi_params;
  12. }
  13.  
  14. location @drupal {
  15.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  16.    fastcgi_index  index.php;
  17.    fastcgi_param  SCRIPT_FILENAME      $document_root/index.php;
  18. ---------------------------------------------------------------------------------------------------------------------
  19.    fastcgi_param  QUERY_STRING         q=$uri&$args;
  20.    fastcgi_param  REQUEST_METHOD       $request_method;
  21.    fastcgi_param  CONTENT_TYPE         $content_type;
  22.    fastcgi_param  CONTENT_LENGTH       $content_length;
  23.    fastcgi_param  REDIRECT_STATUS      200;
  24.    fastcgi_param  SCRIPT_NAME          /index.php;
  25.    fastcgi_param  REQUEST_URI          $request_uri;
  26.    fastcgi_param  DOCUMENT_URI         $document_uri;
  27.    fastcgi_param  DOCUMENT_ROOT        $document_root;
  28.    fastcgi_param  SERVER_PROTOCOL      $server_protocol;
  29.    fastcgi_param  GATEWAY_INTERFACE    CGI/1.1;
  30.    fastcgi_param  SERVER_SOFTWARE      nginx/$nginx_version;
  31.    fastcgi_param  REMOTE_ADDR          $remote_addr;
  32.    fastcgi_param  REMOTE_PORT          $remote_port;
  33.    fastcgi_param  SERVER_ADDR          $server_addr;
  34.    fastcgi_param  SERVER_PORT          $server_port;
  35.    fastcgi_param  SERVER_NAME          $server_name;
  36. ---------------------------------------------------------------------------------------------------------------------
  37. Весь список fastcgi параметров приведен для наглядности, данный блок можно сократить до:
  38.  
  39.    include        fastcgi_params;
  40.    fastcgi_param  QUERY_STRING         q=$uri&$args;
  41.    fastcgi_param  SCRIPT_NAME          /index.php;
  42. }

Более короткий и красивый вариант.

  1. location / {
  2.    try_files $uri $uri/ /index.php?q=$uri&$args;
  3.    index index.php index.html index.htm;
  4. }
  5.  
  6. location ~ \.php$ {
  7.    fastcgi_pass   unix:/tmp/php-fpm.sock;
  8.    fastcgi_index  index.php;
  9.    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  10.    include        fastcgi_params;
  11. }

Вот собственно и все, единственное что стоит добавить, все рассмотренные правила касаются именно SEF, я здесь не затрагивал правила безопасности, так-же добавляемые в htaccess почти всеми движками, возможно распишу попозже)
Всем удачи.

Комментарии

I tried with your wordpress tutorial. But it''s not working with WordPress MU.
You need somethink like
if (!-e $request_filename) {
rewrite ^.+/?(/wp-.*) $1 last;
rewrite ^.+/?(/.*\\.php)$ $1 last;
rewrite ^(.+)$ /index.php?q=$1 last;
}
to get it works,

it's strange.. I just checked, that the construction works without reproach:
server {
listen ip_addr:80;
server_name wordpressmu;
access_log logs/wordpressmu_access.log;
error_log logs/wordpressmu_error.log;
root /usr/home/wordpressmu/public_html;
location / {
try_files $uri $uri/ @wordpressmu;
index index.php index.html index.htm;
}
location ~ \.php$ {
try_files $uri @wordpressmu;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #standart
}
location @wordpressmu {
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params; #standart
}
Permalink settings: "Day and name", "Month and name" and "Numeric"..

if add this location directive, all work )
location ~* ^/files/.+$ {
rewrite ^/files(/.*)$ /wp-content/blogs.php?file=$1 last;
}

Здесь как бы возникает нубский вопрос - что править? Файл nginx.conf или что-то еще?
Заранее спасибо.

в смысле "что править" ? куда добавлять секцию
location ~* ^/files/.+$ {
rewrite ^/files(/.*)$ /wp-content/blogs.php?file=$1 last;
?
в текущий блок server, в котором описан данный хост.
Это может быть как основной nginx.conf, так и любой другой конфиг, например vhost_wpmu.conf, загруженный в основной файл инклудом.
include /usr/local/etc/nginx/conf/vhost_wpmu.conf; в котором описан данный вхост.
или я не правильно понял вопрос ?

Большое спасибо, Сергей.Буду пробовать править.А Вы сами администрированием чужих серверов на возмездной основе не занимаетесь?

занимаюсь, можете связаться со мной через раздел "контакты", данного сайта)

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

Содержание этого поля является приватным и не предназначено к показу.
  • Доступны HTML теги: <em> <strong> <code> <ul> <ol> <li>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

КАПЧА
Регистр имеет значение
  .oooooo..o                ooooooooo  ooo        ooooo               ooooo 
d8P' `Y8 d"""""""8' `88. .888' `888'
Y88bo. oooo ooo .8' 888b d'888 oooo ooo 888
`"Y8888o. `88b..8P' .8' 8 Y88. .P 888 `88. .8' 888
`"Y88b Y888' .8' 8 `888' 888 `88..8' 888
oo .d8P .o8"'88b .8' 8 Y 888 `888' 888
8""88888P' o88' 888o .8' o8o o888o `8' o888o


Введите код, изображенный в стиле ASCII-арт.