1、location
从功能看rewrite和location 似乎有点像,都能实现跳转,主要区别在于:
rewrite是在同-.域名内更改获取资源的路径,
而location是对一 类路径做控制访问或反向代理,还可以proxy_ pass 到其他机器。
1、location的分类
location 大致可以分为三类:
精准匹配:location = / {}
一般匹配:location / {}
正则匹配:location ~ / {}
2、location 常用的匹配规则
字符 | 涵义 |
---|---|
= | 进行普通字符精确匹配,也就是完全匹配 |
^~ | 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location |
~ | 区分大小写的匹配 |
~* | 不区分大小写的匹配 |
!~ | 区分大小写的匹配取非 |
!~* | 不区分大小写的匹配取非 |
3、location 优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配
4、location 示例说明
方式 | 示例解释 |
---|---|
(1) location = / {} | =为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配。 再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。 |
(2) location / {} | 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配, 但若后面是正则表达式会和最长字符串优先匹配(最长匹配) |
(3) location /documents/ {} | 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location, 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条 |
(4) location /documents/abc {} | 匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location, 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条 |
(5)location ^~ /images/ {} | 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条 |
(6)location ~* .(gif|jpg|jpeg)$ {} | 匹配所有以 gif、jpg或jpeg 结尾的请求然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则 |
(7)location /images/abc {} | 最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在 |
(8)location ~ /images/abc {} | 匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条 |
(9)location /images/abc/1.html {} | 匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高 |
优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)
5、实际网站使用中的三个匹配规则定义
5.1 第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
proxy_pass http://tomcat_server/;
}
5.2 第二个必选规则是处理静态文件请求
这是nginx作为http服务器的强项!
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
5.3 第三个规则就是通用规则
比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
二、常用的Nginx 正则表达式
字符 | 功能 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次;如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次;如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次;例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” |
. | 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“ |