目录
一、nginx的匹配方式
nginx中location的优先级和匹配方式:
在http模块中有server,在server中才有location,location匹配的是uri
在一个server中有多个location,如何来确定匹配哪个location。
1、nginx的正则表达式:
^:字符串的起始位置
$:字符串的结束位置
*:匹配所有
+:匹配前面的字符一次或者多次
?:匹配前面的字符0或1次
.:任意单个字符 。 \ .就是点
{n}:连续重复出现n次
{n,m}:连续重复最少n次最多m次n-m
- z0-9A-Z]
[c]:匹配单个字符c
():分组
|:或
2、location匹配的分类:
- 精确匹配 location = /test{....}
完整的路径,一个字都不能少,也不能错
- 正则匹配:location ~ / {}
location ^~:前缀匹配,以什么为开头
location ~:区分大小写进行匹配
location ~*:不区分大小写
location !~:区分大小写,取反匹配
location !~*:不区分大小写,取反匹配
- 一般匹配:location /test {}
示例:
精确匹配:
location = / {
[ configuration A ]
}
一般匹配:
location / {
[ configuration B ]
}
正则匹配:/images/下面的所有
location ^~ /images/ {
[ configuration D ]
}
正则匹配:匹配gif、jpg、jepg结尾的文件
location -* .(gif|jpg|jpeg)$ {
[ configuration E]
}
location匹配一旦匹配成功,不再向下继续匹配
3、location的匹配的优先级:
三个目录全部,放入1.jpg图片
实验发现,精确匹配优先级最高
第二优先级是正则匹配
最后是一般匹配
优先级:
精确匹配——正则匹配——一般匹配
完整的优先级:面试题
location = 完整路径 > location ^~ > location ~,~* > location /test > location /
4、在工作中配置location的原则:
- 网站首页:一律都是精确匹配,一般都是匹配网站根工作目录(一般网站首页都是静态页面)
location = / {
}
- 处理静态文件的请求:目录匹配和后缀匹配
location ^~ /static {
}
location ~* \.{html|jpg|gif|png}$ {
}
- 一般规则:动态请求,把动态请求转发到后端的动态页面的服务器
location / {
proxy_pass http://tomcat setrver;
}
练习:
1、
http://www.example.com/gallery/images/cat.png
- location /gallery { }
- location ^~* /.(png|jpg)$ { }
- location = /gallery/images { }
- location / { }
选择:D
解析:
A,一般匹配,只能匹配到gallery目录下面的文件
B,匹配的是/目录下面,png结尾的文件
C,精确匹配要完整路径,/gallery/images/cat.png
D,一般匹配匹配所有
- 如果访问/abcd 会匹配到哪个config?
- location ~ /abc { }
- location /abc { }
- location ^~ /abc { }
选择:C
- 正则匹配,能匹配到,但是优先级没有C高
- 是匹配/abc下面的文件,匹配不了/abcd目录下面
.
二、nginx的重定向:
1、rewrite:
结合了nginx提供的全局变量和自定义的变量,结合正则表达式以及标志位,实现URL重写以及重定向。
rewrite执行顺序:
- 先执行server块里面的rewrite
- 执行location里面定义的rewrite
- 选定location中的rewrite
rewrite中可以支持if语句,但只有if没有else
rewrite语法:
rewrite <regex> <replacement> [flag]
<regex>:正则表达式
<replcement>:跳转的内容或者路径
[ flag ]:标志位 "标记"
2、flag标志位:
last:本条规则匹配完成之后,继续向下匹配新的location URI规则
如: rewrite ky32 k31 last;
location / {
root html;
rewrite last
}
break:本条规则匹配完之后立即终止,页面内容变化,uri不变
redirct:临时重定向 302 uri的地址会发生变化
permanent:永久重定向
3、配置方式:
永久重定向:
rewrite /test/(.*) /ky32/$1 permanent;
访问test下的所有,都会跳转到/ky32
.*:访问所有
$1:表示捕获组,$1表示正则表达式的第一个捕获组($1 就是前面(.*)里面的内容)
意思是:
访问www.ky32.com/test/index.hmtl 1.jpg
捕获的是www.ky32.com/ky32/inded.html 1.jpg
临时跳转:302
临时跳转和永久跳转的区别:
主要是影响搜索引擎的权重,永久重定向会加入到搜索引擎的排名,临时不会加入搜索引擎的权重。
break的效果:
break既是重定向,但是uri不会改变
break常用
last的效果:last继续匹配
internal redirection cycle while processing
处理请求时发生了重写或者内部重定向循环,进入了无线循环。nginx循环最多执行10次,超过之后会报错,500
把last换成break终止循环,不报错
总结:表面上rewrite和location都可以跳转,似乎有点相同,但是区别在于rewrite是在同一域名之内更改获取资源的路径,location是对路径进行访问控制
4、实验:
1、基于域名的跳转:
例:www.test.com但是公司业务变更,迁移到了新的域名www.koeda.com代替,但是旧域名不能被废除,通过访问test可以跳转到koeda。且匹配的uri还不能变。
$host:请求的主机名,变量名
相当于访问test和koeda域名都是访问20.0.0.30。一个ip可以对应多个域名
2、基于ip访问跳转:
公司业务新版本上线,用户访问网站统一显示固定的维护页面,只有公司的20.0.0.20客户端 能访问,其他都是维护页面
html下面创建error.html文件
第二台主机可以设置hosts域名映射:
3、基于结尾文件跳转
只要访问.php就会跳转到新的界面
点图片跳转,都是这个
去html下面创建upload目录并放入文件
hosts映射test
虚拟机访问upload 就 跳转到 test
三、本章总结:
重点:
location匹配的写法:
location = / 精确匹配,完全匹配,优先级最高
正则匹配:第二优先级
location ^~
location ~*
通用匹配:第三优先级
location /test
location /
location是访问控制。匹配到之后不再向下继续匹配。
网站的设置location规则:
- 精确匹配,只要是为了匹配首页
- location ^~ 或者 location ~* 来进行指定内容匹配
- location / 主要是为了做反向代理,把动态请求转发给后端服务器
rewrite:
permanent:永久重定向
redirect:临时重定向
break:转跳,但是跳转之后不再继续向下匹配,而且不改变uri
last:继续向下匹配,nginx只能循环十次,超过十次报错500
日志里:internal redirection cycle while processing
处理请求时发生了重写或者内部重定向循环,进入了无限循环。nginx循环最多可以执行10次,超过10次,会报错,500