5.9. Nginx location 深入解析

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

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

  • = :字面精确匹配。

  • ^~ :最大前缀匹配。

  • /: 不带任何前缀。

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

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

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

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

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

普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配 还需去看有没有正则表达式匹配和更长的匹配。

^~ 则只匹配该规则,nginx 停止搜索其他匹配,否则 nginx 会继续处理其他 location 指令。 最后匹配理带有”“和”*”的指令,如果找到相应的匹配,则 nginx 停止搜索其他匹配;当 没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会 被使用。

eg

location = / {
#  只匹配"/".
[ configuration A ]
}
location / {
#  匹配任何请求,因为所有请求都是以"/" 开始
#  但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location = /images/ {
#  匹配任何以 /images/  开始的请求,并停止匹配  其它 location
[ configuration C ]
root /tmp/;
}
location ~* \.(gif|jpg|jpeg)$ {
#  匹配以 gif, jpg, or jpeg  结尾的请求.
#  但是所有 /images/  目录的请求将由 [Configuration C] 处理.
[ configuration D ]
Root /var/www/html/
}

请求 URI 例子:

  / -> 符合 configuration A
  /documents/document.html -> 符合 configuration B
  /images/1.gif -> 符合 configuration C
/documents/1.jpg ->符合 configuration D

正常的优先级别为: (location =) > (location 完整路径 >) >(location ^~ 路径) >(location ~* 正 正 则 则) >(location 路径)

生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:

#匹配/,优先级最低
location /
{
    root /var/www/html/;
 expires      60d;
}
#匹配静态页面,由本地解析
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
 root /var/www/html/;
 expires      60d;
}
#匹配动态页面,交给后端服务器
location ~ .*\.(jsp|php|cgi|do)$
{
    root /var/www/html/;
    proxy_pass http://linux_web;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host  $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#直接匹配newindex.html,优先级最高
location =/newindex.html
{
    root /var/www/newwww/;
 expires      60d;
}