Nginx: различия между версиями
Материал из lulzette's wiki
Losted (обсуждение | вклад) (Новая страница: «== Скрыть версию и ось на 404 == <code>server_tokens off;</code> == страшная редиректовая ебола == === rewrite ===…») |
Losted (обсуждение | вклад) Нет описания правки |
||
Строка 6: | Строка 6: | ||
=== rewrite === | === rewrite === | ||
<source> | |||
Синтаксис: rewrite regex замена [флаг]; | |||
Умолчание: — | |||
Контекст: server, location, if | |||
</source> | |||
Если указанное регулярное выражение соответствует URI запроса, URI изменяется в соответствии со строкой замены. Директивы rewrite выполняются последовательно, в порядке их следования в конфигурационном файле. С помощью флагов можно прекратить дальнейшую обработку директив. Если строка замены начинается с “http://”, “https://” или “$scheme”, то обработка завершается и клиенту возвращается перенаправление. | |||
Необязательный параметр флаг может быть одним из: | |||
last | |||
завершает обработку текущего набора директив модуля ngx_http_rewrite_module, после чего ищется новый location, соответствующий изменённому URI; | |||
break | |||
завершает обработку текущего набора директив модуля ngx_http_rewrite_module аналогично директиве break; | |||
redirect | |||
возвращает временное перенаправление с кодом 302; используется, если заменяющая строка не начинается с “http://”, “https://” или “$scheme”; | |||
permanent | |||
возвращает постоянное перенаправление с кодом 301. | |||
Полный URL перенаправлений формируется согласно схеме запроса ($scheme) и директив server_name_in_redirect и port_in_redirect. | |||
Пример: | |||
<source> | |||
server { | |||
... | |||
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; | |||
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; | |||
return 403; | |||
... | |||
} | |||
</source> | |||
Если же эти директивы поместить в location “/download/”, то нужно заменить флаг last на break, иначе nginx сделает 10 циклов и вернёт ошибку 500: | |||
<source> | |||
location /download/ { | |||
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; | |||
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; | |||
return 403; | |||
} | |||
</source> | |||
Если в строке замены указаны новые аргументы запроса, то предыдущие аргументы запроса добавляются после них. Если такое поведение нежелательно, можно отказаться от этого добавления, указав в конце строки замены знак вопроса, например: | |||
<code>rewrite ^/users/(.*)$ /show?user=$1? last;</code> | |||
Если в регулярном выражении встречаются символы “}” или “;”, то всё выражение следует заключить в одинарные или двойные кавычки. | |||
Строка 15: | Строка 70: | ||
=== try_files === | === try_files === | ||
Модуль ngx_http_core_module | |||
Директиву try_files удобно использовать в случае, если необходимо проверить несколько папок перед отдачей файла: | |||
<source> | |||
server { | |||
... | |||
root /var/www; | |||
try_files $uri /var/storage$uri; | |||
... | |||
} | |||
</source> | |||
# Проверим наличие файла в папках /var/www и /var/storage | |||
Для PHP часто необходимо все запросы отправлять на index.php, если не существует файла: | |||
<source> | |||
server { | |||
... | |||
root /var/www; | |||
try_files $uri /index.php; | |||
location ~ \.php$ { | |||
fastcgi_pass 127.0.0.1:9000; | |||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |||
include fastcgi_params; | |||
} | |||
} | |||
</source> | |||
# проверим наличие файла и запустим index.php, если такого файла не существует |
Версия от 22:24, 7 ноября 2019
Скрыть версию и ось на 404
server_tokens off;
страшная редиректовая ебола
rewrite
Синтаксис: rewrite regex замена [флаг];
Умолчание: —
Контекст: server, location, if
Если указанное регулярное выражение соответствует URI запроса, URI изменяется в соответствии со строкой замены. Директивы rewrite выполняются последовательно, в порядке их следования в конфигурационном файле. С помощью флагов можно прекратить дальнейшую обработку директив. Если строка замены начинается с “http://”, “https://” или “$scheme”, то обработка завершается и клиенту возвращается перенаправление.
Необязательный параметр флаг может быть одним из:
last
завершает обработку текущего набора директив модуля ngx_http_rewrite_module, после чего ищется новый location, соответствующий изменённому URI;
break
завершает обработку текущего набора директив модуля ngx_http_rewrite_module аналогично директиве break;
redirect
возвращает временное перенаправление с кодом 302; используется, если заменяющая строка не начинается с “http://”, “https://” или “$scheme”;
permanent
возвращает постоянное перенаправление с кодом 301.
Полный URL перенаправлений формируется согласно схеме запроса ($scheme) и директив server_name_in_redirect и port_in_redirect.
Пример:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
Если же эти директивы поместить в location “/download/”, то нужно заменить флаг last на break, иначе nginx сделает 10 циклов и вернёт ошибку 500:
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
Если в строке замены указаны новые аргументы запроса, то предыдущие аргументы запроса добавляются после них. Если такое поведение нежелательно, можно отказаться от этого добавления, указав в конце строки замены знак вопроса, например:
rewrite ^/users/(.*)$ /show?user=$1? last;
Если в регулярном выражении встречаются символы “}” или “;”, то всё выражение следует заключить в одинарные или двойные кавычки.
root/alias
location
try_files
Модуль ngx_http_core_module
Директиву try_files удобно использовать в случае, если необходимо проверить несколько папок перед отдачей файла:
server {
...
root /var/www;
try_files $uri /var/storage$uri;
...
}
- Проверим наличие файла в папках /var/www и /var/storage
Для PHP часто необходимо все запросы отправлять на index.php, если не существует файла:
server {
...
root /var/www;
try_files $uri /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- проверим наличие файла и запустим index.php, если такого файла не существует