作为程序员一定要保持良好的睡眠,才能好编程

Nginx之Location配置详解(Location 优先级顺序)

发布时间:2018-12-16

location可以把网站的不同部分,定位到不同的处理方式上.


1、location的基本语法

location [=|~|~*|^~] patt { 


} 

=:严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。

~:为区分大小写匹配(可用正则表达式)。 
~*:为不区分大小写匹配(可用正则表达式)。 
^~:如果把这个前缀用于一个常规字符串,如果匹配上此规则,后面的将不在匹配
/:通用匹配 任何请求都会匹配到

2、匹配规则

正则.png



3、论述下匹配规则

    不带正则表达式的匹配过程


location = / { 
    root /var/www/html/;
    index index.htm index.html; 
} 

location / {
    root /usr/local/nginx/html; 
    index index.html index.htm; 
} 

location配置如上,若访问http://xxx.com/,定位的流程是: 
1:精准匹配命中"/",得到index页为index.htm,所以请求的地址变为http://xxx.com/index.htm 
2:再次匹配"/index.htm",此次内部转跳uri已经是"/index.htm",命中普通匹配"/",根目录为/usr/local/nginx/html 
3:最终结果,访问了/usr/local/nginx/html/index.htm

location.png


访问:http://192.168.61.103/

首先精确匹配到了 = / 这个规则,然后 带上了 /index.htm 继续找寻

到了 普通匹配,找到了html 目录下有一个index.htm的文件,因此显示出来。

并没有说精确匹配到以后,就停止,而是继续匹配。

location2.png


location表达式类型

~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
= 进行普通字符精确匹配。也就是完全匹配。
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files






location优先级说明

在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列说明:

等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
正则表达式类型(~ ~*)的优先级次之。

如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
常规字符串匹配类型。按前缀匹配。




ocation作用

location指令的作用是根据用户请求的URI来执行不同的应用。即根据用户请求的网站地址URL进行匹配,匹配成功就进行相应的操作。

语法

location的语法规则:location [=|~|~*|^~] /uri/ { … }
location匹配的变量是$uri
关于几种字符的说明


字符描述
=表示精准匹配
~表示区分大小写的正则匹配
~*表示不区分大小写的正则匹配
^~表示uri以指定字符或字符串开头
/通用匹配,任何请求都会匹配到
规则优先级

= 高于 ^~ 高于 ~* 等于 ~ 高于 /

location = "/12.jpg" { ... }
如:
www.xxx.com/12.jpg 匹配
www.xxx.com/abc/12.jpg 不匹配

location ^~ "/abc/" { ... }
如:
www.xxx.com/abc/123.html 匹配
www.xxx.com/a/abc/123.jpg 不匹配

location ~ "png" { ... }
如:
www.xxx.com/aaa/bbb/ccc/123.png 匹配
www.xxx.com/aaa/png/123.html 匹配

location ~* "png" { ... }
如:
www.xxx.com/aaa/bbb/ccc/123.PNG 匹配
www.xxx.com/aaa/png/123.html 匹配


location /admin/ { ... }
如:
www.xxx.com/admin/aaa/1.php 匹配
www.xxx.com/123/admin/1.php 不匹配


注意:
有些资料上介绍location支持不匹配 !~如: location !~ 'png'{ ... }
这是错误的,location不支持 !~
如果有这样的需求,可以通过if(location优先级小于if )来实现,如: if ($uri !~ 'png') { ... }


location优先级示例

    location = / {
    # 仅仅匹配请求 /
    [ configuration A ]
    }
    location / {
    # 匹配所有以 / 开头的请求。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration B ]
    }
    location /documents/ {
    # 匹配所有以 /documents/ 开头的请求。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration C ]
    }
    location ^~ /images/ {
    # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。
    # 所以,即便有符合的正则表达式location,也不会被使用
    [ configuration D ]
    }
    location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 gif jpg jpeg结尾的请求。
    # 但是 以 /images/开头的请求,将使用 Configuration D
    [ configuration E ]
    }

.

/ -> configuration A
/index.html -> configuration B
/documents/document.html -> configuration C
/images/1.gif -> configuration D
/documents/1.jpg -> configuration E



注意,以上的匹配和在配置文件中定义的顺序无关。



实际使用建议

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}