Nginx嵌套Location优先级疑问:为何/wp-content/uploads下PHP文件返回410?
Nginx嵌套Location优先级疑问解答
我的Nginx配置片段
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } location /wp-content/uploads/ { location ~ .(aspx|php|jsp|cgi)$ { return 410; } }
我理解的Location优先级顺序
= (精确匹配) --> ^~ (前缀优先匹配) --> ~ (正则) 或 ~* (不区分大小写正则) --> (普通前缀匹配)
疑问
我在/wp-content/uploads目录下放置了一个PHP文件,请求/wp-content/uploads/info.php时得到了预期的410响应,但无法理解:
- 既然正则location优先级高于前缀location,为何第一个正则location没有捕获该请求?
- 按规则多个匹配的正则location中,先声明的会处理请求,但此处却是后出现的嵌套正则处理了请求。
原因解析
- 嵌套Location的匹配逻辑:Nginx的Location匹配是分阶段的,首先会找到最匹配的外层前缀Location,之后只会在该外层Location的嵌套子Location中进行后续匹配,完全忽略外层的其他正则Location。当请求
/wp-content/uploads/info.php时,首先匹配到了location /wp-content/uploads/这个更具体的前缀规则,Nginx随即进入该块内部,外层的location ~ \.php$不再参与匹配。 - 正则匹配的范围限制:外层正则
~ \.php$虽然能匹配请求URL,但因为请求已经先命中了更精准的前缀Location,Nginx的匹配逻辑会直接锁定到该前缀块的内部规则,不会再回溯匹配外层的正则。 - 嵌套正则的执行逻辑:进入
/wp-content/uploads/块后,内部的嵌套正则~ .(aspx|php|jsp|cgi)$刚好匹配到请求的URL,因此执行return 410规则,这完全符合Nginx在当前块内的正则匹配优先级。
内容的提问来源于stack exchange,提问作者pkSML
相关产品推荐
相关产品推荐

