将正则表达式放在前缀位置之前还是之后有关系吗?
考虑以下配置:
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;
}
}
请注意,虽然我已将正则表达式分组在一起,并且它们现在出现在顶部附近,但正则表达式仍然遵循相同的顺序。这两种配置的行为是否相同?
答案1
文档中关于匹配顺序的说明如下:
为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。
如果最长匹配的前缀位置有“^~”修饰符,则不检查正则表达式。
此外,使用“=”修饰符可以定义 URI 和位置的精确匹配。如果找到精确匹配,则搜索终止。
https://nginx.org/en/docs/http/ngx_http_core_module.html#location