TrumanWong

Nginx Location深入刨析

TrumanWong
11/25/2021

Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅是通过查找配置文件将客户端的请求映射到一个location block,而locationNginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

默认nginx.conf配置文件中至少存在一个location/,即表示客户端浏览器请求的URL为域名+/,如果location/index/,则表示客户端浏览器请求的URL为域名+/newindex/。常见location匹配URL的方式如下:

  • :字面精确匹配

  • ^~:最大前缀匹配

  • /:不带任何前缀

  • :大小写相关的正则匹配

  • ~∗:大小写无关的正则匹配

  • @:location内部重定向的变量

其中^~/属于普通字符串匹配,~∗属于正则表达式匹配,location优先级与其在nginx.conf配置文件中的先后顺序无关。

精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其他任何location的匹配。

普通字符匹配,正则表达式规则和完整URL规则将被优先查询匹配,^~为最大前缀匹配,如果匹配到该规则,Nginx则停止搜索其他任何location的匹配,否则Nginx会继续处理其他location指令。

正则匹配~∗,如果找到相应的匹配,则Nginx停止搜索其他任何location的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

location规则匹配优先级总结如下:

= > location完整路径 > ^~ > ~~* 正则顺序 > location部分起始路径 > /

以下为Nginx location规则案例演示:

location = / {
    [ configuration A ]
    # 只会匹配/,优先级比location /低
}

location / {
    [ configuration B ]
    # 匹配任何请求,因为所有请求都是以“/”开始
    # 但是更长字符匹配或者正则表达式匹配会优先匹配,优先级最低
}

location = /index.html {
    [ configuration C ]
    # 只会匹配/index.html,优先级最高
}

location ^~ /images/ {
    [ configuration D ]
    # 匹配任何以/images/开始的请求,并停止匹配其他location
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
    # 匹配以gif、jpg、jpeg结尾的URL文件请求
    # 但是所有/images/目录的请求将由[ configuration D ]处理
}

浏览器发起HTTP request URI案例与location规则案例匹配如下:

  • /:匹配configuration B
  • /index.html:匹配configuration C
  • /images/:匹配configuration D
  • /images/logo.png:匹配configuration D
  • /img/test.jpg:匹配configuration E