You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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响应,但无法理解:

  1. 既然正则location优先级高于前缀location,为何第一个正则location没有捕获该请求?
  2. 按规则多个匹配的正则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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:40:32