nginx location 正则优先级

Nginx 可以将流量发送到不同的代理服务器,或者根据请求 URI 提供不同的文件。通过在 server 指令中使用 location 指令实现这些功能。
例如,可以在虚拟服务器中定义 3 个 location 块,将一部分请求发到被代理的服务器,另一部分请求发到另一个被代理的服务器,其他请求则映射到本地的文件系统。
Nginx 会根据 location 指令的参数来测试请求的 URI,并使用匹配到的 location 指令。location 块通常可以嵌套,实现对请求的分组处理。
location 指令有两种参数:前缀字符串(路径名)和正则表达式。要匹配前缀字符串的请求 URI 必须以这个前缀字符串开头才会匹配成功。

前缀字符串(路径名)

下面的 location 指令参数使用了路径名,请求 URI 要匹配这个 location,就必须以 /some/path/开头,比如 /some/path/document.html。而 /my-site/some/path 就不匹配。

location /some/path/ {
    ...
}

正则表达式

  • 以 ~ 开头时,表示区分大小写
  • 以 ~* 开头时,表示不区分大小写

下面的例子中,如果请求 URI 中的任何位置出现 .html 或 .htm 就匹配成功:

location ~ \.html? {
    ...
}

location 匹配原则

为了找出最匹配 URI 的 location,Nginx 会先比较前缀字符串(路径名),再比较正则表达式。
正则表达式的优先级较高,除非使用 ^〜 修饰符。在前缀字符串中,Nginx 选择最特定的字符串(即最长和最完整的字符串)。 下面给出了选择处理请求的位置的确切逻辑:

  • 用所有的前缀字符串测试 URI。
  • 等号 = 定义了前缀字符串和 URI 的精确匹配关系。如果找到了这个精确匹配,则停止查找。
  • 如果 ^~ 修饰符预先匹配到最长的前缀字符串,则不检查正则表达式。
  • 存储最长的匹配前缀字符串。
  • 用正则表达式测试 URI。
  • 匹配到第一个正则表达式后停止查找,使用对应的 location。
  • 如果没有匹配到正则表达式,则使用之前存储的前缀字符串对应的 location。

等号 = 最常见的用途就是 / (forward slash)。如果对 / 的请求很多,可以把 = / 指定为 location 的参数来提高响应速度。因为在第一次比较之后就停止搜索匹配。

location = / {
    ...
}
  • last – 在当前的 server 或 location 上下文中中断 rewrite 指令的执行。此时 Nginx 会查找要重写 URI 的 location,并且应用新 location 中的任何 rewrite 指令(意味着 URI 可以再次更改)。
  • break – 跟 break 指令类似,在当前的上下文中停止 rewrite 指令,停止查找匹配新的 URI 的 location。新的 location 中的 rewrite 指令不会执行。

相关文章

发表新评论