Skip to main content

nginx的location匹配规则

Nginx 的 location 语法

location [=|~|~*|^~] /uri/ { … }

  • = 严格匹配。如果请求匹配这个 location,那么将停止搜索并立即处理此请求
  • ~ 区分大小写匹配(可用正则表达式)
  • ~_ 不区分大小写匹配(可用正则表达式)
  • ^~ 如果把这个前缀用于一个常规字符串,那么只要匹配该规则,nginx 会停止搜索其他匹配

示例说明

location  = / {
# 精确匹配 / ,主机名后面不能带任何字符串
...
}

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

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

location ~ .*/remote-entry.js$ {
# 匹配此规则之后,nginx就不再匹配后面的正则
add_header Cache-Control no-store;
}

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

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

location ~ /intellisense-form.*\.(gif|jpg|jpeg|png|bmp|swf|js|css|md|pdf|ttf|ttc|eot|woff2|woff|svg)$ {
# 此规则为intellisense-form文件夹下所有以上述后缀结尾的文件,都要缓存
# 但remote-entry.js在上一个正则表达式已经被匹配,所以不会执行改规则
expires 365d;
}

规则总结

  1. 先普通,再正则。
  2. 普通 location 之间的匹配顺序:按最大前缀匹配。如 location /a/{},location /a/b/ {},请求 http://a/b/c.html 匹配的是 location /a/b/ {}。
  3. 正则 location 之间的匹配顺序:按配置文件中的物理顺序匹配,只要匹配到一条正则,就不再考虑后面的。
  4. 若普通 location 匹配到 精确匹配= 或 非正则匹配 ^~, 则不再进行后续的正则匹配。
  5. 普通 location 与正则 location 之间的匹配结果选择: 普通 location 先匹配,匹配到之后,会作为一个临时结果;然后继续正则 location 的匹配,如果匹配到正则,则用匹配到的正则结果;如果没有匹配到正则,则继续用普通匹配的那个结果。