Замена 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:
RewriteBase /RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d## RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] ## опционально ##RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC]RewriteRule ^(content/|component/) index.php
Эквивалент для настройки сервера nginx
location / {index index.php index.html index.htm;
}
## в поставляемом с дистрибутивом, файле htaccess, есть опциональная строка, по-умолчанию закомментирована## данный блок ее эквивалент для nginx## location ^~ /component/option,com {# index index.php index.html index.htm;# try_files $uri $uri/ @joomla;# }#####location ~* (\.html?|/|/[^.]*)$ {try_files $uri $uri/ @joomla;
index index.php index.html index.htm;
}
location ~ \.php$ {try_files $uri @joomla;
fastcgi_pass unix:/tmp/php-fpm.sock; ## Ваш fastcgi серверfastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; ## стандартный файл, идущий с nginx
}
location @joomla {fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;}
Конфигурация Nginx и Apache для Joomla 1.5.10
Правила htaccess:
RewriteBase /RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_URI} !^/index.phpRewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC]RewriteRule (.*) index.phpRewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
Эквивалент для настройки сервера nginx
location / {index index.php index.html index.htm;
}
location ~* (/|\.html?|\.feed|\.pdf|\.raw|/[^.]*)$ {try_files $uri $uri/ @joomla;
}
location ~ \.php$ {try_files $uri @joomla;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;}
location @joomla {fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REDIRECT_STATUS 200;fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
}
Примечание: в первом примере, fastcgi_param были загружены из стандартного файла, идущего в поставке nginx, во втором, я не стал инклудить файл с параметрами а просто прописал их в конфиг, обратите внимание что параметр SCRIPT_NAME, отличается от первого примера.
Конфигурация Nginx и Apache для Wordpress 2.7.1
Правила htaccess:
RewriteBase /RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /index.php [L]
Эквивалент для веб сервера nginx
location / {try_files $uri $uri/ @wordpress;
index index.php index.html index.htm;
}
location ~ \.php$ {try_files $uri @wordpress;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;}
location @wordpress {fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;}
Как видите, тут мы тоже просто инклудим стандартный файл с fastcgi параметрами
Конфигурация Nginx и Apache для Drupal 6.12
Правила htaccess:
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_URI} !=/favicon.icoRewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Эквивалент для сервера nginx
location / {try_files $uri $uri/ @drupal;
index index.php index.html index.htm;
}
location ~ \.php$ {try_files $uri @drupal;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;}
location @drupal {fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
---------------------------------------------------------------------------------------------------------------------
fastcgi_param QUERY_STRING q=$uri&$args;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REDIRECT_STATUS 200;fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
---------------------------------------------------------------------------------------------------------------------
Весь список fastcgi параметров приведен для наглядности, данный блок можно сократить до:
include fastcgi_params;fastcgi_param QUERY_STRING q=$uri&$args;
fastcgi_param SCRIPT_NAME /index.php;
}
Более короткий и красивый вариант.
location / {try_files $uri $uri/ /index.php?q=$uri&$args;
index index.php index.html index.htm;
}
location ~ \.php$ {fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;}
Вот собственно и все, единственное что стоит добавить, все рассмотренные правила касаются именно 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; в котором описан данный вхост.
или я не правильно понял вопрос ?
Большое спасибо, Сергей.Буду пробовать править.А Вы сами администрированием чужих серверов на возмездной основе не занимаетесь?
занимаюсь, можете связаться со мной через раздел "контакты", данного сайта)
Отправить комментарий