location可以把网站的不同部分,定位到不同的处理方式上.
1、location的基本语法
location [=|~|~*|^~] patt { } =:严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。 ~:为区分大小写匹配(可用正则表达式)。 ~*:为不区分大小写匹配(可用正则表达式)。 ^~:如果把这个前缀用于一个常规字符串,如果匹配上此规则,后面的将不在匹配 /:通用匹配 任何请求都会匹配到
2、匹配规则
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
访问:http://192.168.61.103/
首先精确匹配到了 = / 这个规则,然后 带上了 /index.htm 继续找寻
到了 普通匹配,找到了html 目录下有一个index.htm的文件,因此显示出来。
并没有说精确匹配到以后,就停止,而是继续匹配。
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/ }