location 的分类和常见的匹配规则
location 大致可以分为三类:
类别 | 公式 |
---|
精准匹配 | location = / {…} |
一般匹配 | location / {…} |
正则匹配 | location ~ / {…} |
location 常用的匹配规则:
| |
---|
= | 进行普通字符精确匹配,也就是完全匹配。 |
^~ | 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。 |
~ | 区分大小写的匹配。 |
~* | 不区分大小写的匹配。 |
!~ | 区分大小写的匹配取非。 |
!~* | 不区分大小写的匹配取非。 |
location 优先级:
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配
location优化
精准匹配减少处理
#因为每个网站的首页被访问的都是最频繁的,因此我们设置一个精确匹配,匹配到后直接跳转
location = / {
#root html; #此处假设首页是静态页面,且根目录在html
#proxy_pass http://tomcat_server; #次数假设首页是动态页面,且已定义tomcat服务池
}
正则匹配静态页面
#处理静态页面是Nginx的强项,设置正则匹配,凡是静态页面的则直接寻找Nginx对应目录
location ~* \.(jpg|png|jpge|gif)$ {
#root html/img;
}
通用规则防止语法漏洞
#匹配规则想穷举完太难了,那么没被列举出来的就需要通用匹配来处理了
location / {
root html;
}
rewrite重写
定义
- 规则等级:rewrite是server/location/if 匹配规则的子规则,当父规则匹配到后才能执行- - rewrite功能
- 重写规则:默认只修改域名后方的路径
- 模块支持:需要安装rewrite模块;支持if条件判断,不支持else判断;最多支持location循环10次;添加permanent支持永久重定向;
rewrite重写
location ~* \.(jpg|png)$ {
rewrite (.+) /haha.jpge; #将符合匹配规则的路径,转换为访问/haha.jpge,可添加if判断达到防盗链的效果.
}
#通过if判断赋值,再次if判断,时候进入rewrite重写规则
set $rewrite true;
if ($remote_addr = "192.168.13.10"){
set $rewrite false;
}
if ($rewrite = true){
rewrite (.+) /weihu.html;
}
#通过location匹配后,仅修改主机名,假设之前主机名为:www.han.com
location ~* \.(jpg|png)$ {
rewrite ^/(.*) http://www.wang.com/$1 permanent;
}
注意事项
- 匹配优先度高的放在上方,节约系统性能
- 重写之后的路径不要与当前的正则匹配出现重叠现象,否则可能会出现匹配死循环