31.07.10

nginx rewrite rules делаем их правильно

Так как мы боремся за высокую производительность на чудесном веб сервере nginx, то мы не должны забывать про то, чтобы сделать наши конфиги еще чудеснне, в особенности в этом аспекте...


... но нас портит привычка от Апача
Вот стандартная строка из.htaccess, которая перекочевала в новый конфиг:
RewriteCond  %{HTTP_HOST}  nginx.org
RewriteRule  (.*)          http://www.nginx.org$1


вот в таком виде:
server {
    listen       80;
    server_name  www.nginx.org  nginx.org;
    if ($http_host = nginx.org) {
        rewrite  (.*)  http://www.nginx.org$1;
    }
    ...
}



Это неправильно, громоздко и неэффективно.
Правильный путь заключается в определении отдельного сервера для nginx.org:
server {
    listen       80;
    server_name  nginx.org;
    rewrite   ^  http://www.nginx.org$request_uri?;
}

server {
    listen       80;
    server_name  www.nginx.org;
    ...
}

Еще один пример, с обратной логикой: все, что не nginx.com и не www.nginx.com:
RewriteCond  %{HTTP_HOST}  !nginx.com
RewriteCond  %{HTTP_HOST}  !www.nginx.com
RewriteRule  (.*)          http://www.nginx.com$1


а нужно делать вот так:
server {
    listen       80;
    server_name  nginx.com  www.nginx.com;
    ...
}

server {
    listen       80 default_server;
    server_name  _;
    rewrite   ^  http://nginx.com$request_uri?;
}



Мутируем правила для Mongrel

Типичные Mongrel правила:
DocumentRoot /var/www/myapp.com/current/public

RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]

превращаем вот такое
location / {
    root       /var/www/myapp.com/current/public;

    try_files  /system/maintenance.html
               $uri  $uri/index.html $uri.html
               @mongrel;
}

location @mongrel {
    proxy_pass  http://mongrel;
}



Отсюдова
http://nginx.org/en/docs/http/converting_rewrite_rules.html