Действия

Nginx: различия между версиями

Материал из lulzette's wiki

(Новая страница: «== Скрыть версию и ось на 404 == <code>server_tokens off;</code> == страшная редиректовая ебола == === rewrite ===…»)
 
Нет описания правки
Строка 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;
	...
}
  1. Проверим наличие файла в папках /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;
	}
}
  1. проверим наличие файла и запустим index.php, если такого файла не существует