Nginx 的 location 看似只是路径匹配,但前缀、精确、正则之间有优先级。理解匹配顺序,能减少很多配置上的误判。

常见类型

常见写法包括:

1
2
3
4
5
location = /exact { }
location /prefix/ { }
location ^~ /static/ { }
location ~ \.php$ { }
location ~* \.jpg$ { }

它们分别表示精确匹配、普通前缀匹配、优先前缀匹配、区分大小写正则、不区分大小写正则。

匹配顺序

简化理解如下:

  1. 先找精确匹配 =
  2. 再找最长前缀匹配;
  3. 如果最长前缀带 ^~,直接使用;
  4. 否则继续按配置顺序检查正则;
  5. 正则没有匹配时,使用之前找到的最长前缀。

因此普通前缀匹配不一定最终生效,正则可能覆盖它。

root 与 alias

root 会把请求 URI 拼到目录后面;alias 则用指定目录替换匹配前缀。二者语义不同,混淆时容易出现路径多一段或少一段的问题。

示例:

1
2
3
location /static/ {
root /var/www;
}

请求 /static/a.png 会对应 /var/www/static/a.png

1
2
3
location /static/ {
alias /var/www/assets/;
}

请求 /static/a.png 会对应 /var/www/assets/a.png

小结

配置 location 时,可以先判断是否需要精确匹配,再决定是否需要 ^~ 阻止正则覆盖。路径映射则要分清 rootalias