Nginx location 匹配规则

匹配命令

~   正则匹配,区分大小写
~* 正则匹配,不区分大小写
= 普通字符精确匹配,如果找到,停止搜索
^~ 普通字符匹配(如果该选项匹配,只匹配该选项,一般用来匹配目录)
/ 通用匹配,如果没有其它匹配,任何请求都会匹配到
@ 定义命名的 location,使用在内部定向时,例如:error_page、try_files

匹配优先级(与在配置文件中的顺序无关)

1. 精确匹配 ”=“ 会第一个被处理。如果发现精确匹配,停止搜索。
2. 匹配最长的规则,如果这个规则带有 ^~ 修饰符,停止搜索。
3. 存储 #2 的最长匹配规则,然后按在配置文件中的定义顺序匹配正则表达,若匹配到正则表达式,停止搜索。
4. 若没有匹配到正则表达式,使用存储的 #2 的最长匹配。
官方文档
  1. Directives with the = prefix that match the query exactly. If found, searching stops.
  2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
  3. Regular expressions, in order of definition in the configuration file.
  4. If #3 yielded a match, that result is used. Else the match from #2 is used.
  1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用 ^〜 前缀,搜索停止。
  3. 正则表达式,在配置文件中定义的顺序。
  4. 如果第三条规则产生匹配的话,结果被使用。否则,使用第二条规则的结果。
例子
# @location 例子
error_page 404 = @fetch;

location @fetch {
[ configuration X ]
}

location = / {
# 精确匹配 /
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}


location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ~ /documents/Abc {
[ configuration CC ]
}

location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索,采用这一条
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}

location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}

location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F 与 G 的放置顺序是没有关系的
[ configuration G ]
}

location ~ /images/abc/ {
# 只有去掉 config D 才有效
# 先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}

location ~* /js/.*/\.js

常用例子

静态文件

处理静态文件请求,这是 nginx 作为 http 服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

# 目录匹配
location ^~ /static/ {
root /webroot/static/;
}

# 后缀匹配
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
alias /webroot/res/;
}

参考资料