Имеет ли значение, размещаете ли вы регулярные выражения до или после префиксов?
Рассмотрим эту конфигурацию:
server {
listen 80 default_server;
server_name www.example.com;
root /var/www/nginx/example.com/public_html;
index index.php index.html index.htm;
location ~ /\.well-known { allow all; }
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; allow all;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ ^.+\.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; }
location ~ /\. { access_log off; log_not_found off; deny all; }
}
по сравнению с этой:
server {
listen 80 default_server;
server_name www.example.com;
root /var/www/nginx/example.com/public_html;
index index.php index.html index.htm;
location ~ /\.well-known { allow all; }
location ~ ^.+\.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; }
location ~ /\. { access_log off; log_not_found off; deny all; }
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; allow all; }
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
}
Обратите внимание, что хотя я сгруппировал регулярные выражения вместе и теперь они появляются вверху, регулярные выражения по-прежнему следуют в том же последовательном порядке. Будут ли эти две конфигурации вести себя одинаково?
Это то, что говорится в документации о порядке совпадения:
Чтобы найти местоположение, совпадающее с заданным запросом, nginx сначала проверяет местоположения, определенные с помощью префиксных строк (префиксных местоположений). Среди них выбирается и запоминается местоположение с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в конфигурационном файле. Поиск регулярных выражений завершается при первом совпадении и используется соответствующая конфигурация. Если совпадение с регулярным выражением не найдено, то используется конфигурация ранее запомненной локации префикса.
Если самая длинная локация префикса совпадения имеет модификатор "^~", то регулярные выражения не проверяются.
Также, используя модификатор "=" можно определить точное совпадение URI и локации. Если точное совпадение найдено, поиск завершается.
https://nginx.org/en/docs/http/ngx_http_core_module.html#location