Nginx:正则表达式放在前缀位置之前还是之后有关系吗?

Nginx:正则表达式放在前缀位置之前还是之后有关系吗?

将正则表达式放在前缀位置之前还是之后有关系吗?

考虑以下配置:

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

相关内容