nginx匹配规则
在 Nginx 中,location
配置的位置顺序是否影响匹配优先级,取决于 location
的类型。具体规则如下:
1. 对于「正则匹配 location」(~
或 ~*
开头)
- 位置顺序会影响匹配结果:Nginx 会按配置文件中出现的先后顺序检查正则匹配,一旦找到第一个匹配的正则规则,就会停止后续检查并使用该规则。
- 示例:
# 正则匹配1:先出现,会优先匹配所有 .png 文件 location ~* \.png$ {# 配置1 }# 正则匹配2:后出现,不会被触发(因为 .png 已被上面的规则匹配) location ~* \.(png|jpg)$ {# 配置2 }
xxx.png
会匹配第一个规则,第二个规则中的.png
永远不会生效。
2. 对于「前缀匹配 location」(普通前缀或 ^~
)
- 位置顺序不影响优先级:Nginx 会根据「匹配长度」决定优先级,最长的前缀匹配会被优先选择,与配置顺序无关。
- 示例:
# 前缀匹配1:较短路径 location /api/ {# 配置A }# 前缀匹配2:较长路径(更精确) location /api/user/ {# 配置B }
/api/user/123
时,会优先匹配location /api/user/
(更长的前缀),即使它在配置文件中后出现。
3. 不同类型 location 的优先级排序(与顺序无关)
当不同类型的 location
同时存在时,优先级从高到低为:
- 精确匹配(
location = /path
) - 带
^~
的前缀匹配(location ^~ /path
) - 正则匹配(
location ~ /path
或~* /path
,按配置顺序匹配) - 普通前缀匹配(
location /path
,按最长匹配长度选择)
总结
- 正则匹配(
~
/~*
):顺序影响优先级,先出现的规则优先匹配。 - 前缀匹配(普通或
^~
):顺序不影响,由匹配长度(或^~
修饰符)决定优先级。
因此,在配置时需特别注意正则匹配的顺序,避免短规则覆盖长规则;而前缀匹配则无需关心顺序,只需保证路径精确性即可。