rewite跳转
nginx通过ngx_http_rewrite_module模块实现
支持URL重写、支持if条件判断,但是不支持else
跳转时,循环最多可以执行10次,超过后nginx将返回500错误
Rewite使用场景
-
使用rewrite进行匹配跳转
-
使用if匹配全局变量后跳转
-
使用location匹配再跳转
rewrite放在server{}、if{}、location{} 段中
对域名或参数字符串 -
使用if全局变量匹配
-
使用proxy_pass反向代理
rewrite命令
rewrite [flag];
flag
- last 相当于apache的【L】标记,表示完成rewrite
- break 本条规制匹配完成即终止,不在匹配后面的任何规则
- redirect 返回302零时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更 新url
- permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url
last和break比较
- last 一般写在server中和if中 USR匹配 不终止重写后的url匹配
- bresk 一般使用在location中 USR匹配 终止重写后的url匹配
## location分类
分类
-
location = patt {} 【精确匹配】
-
location patt {} 【一般匹配】
-
location ~ patt {} 【正则匹配】
正则匹配的常用表达式 -
~ 执行一个正则匹配,区分大小写
-
~* 执行一个正则匹配,不区分大小写
-
!~ 执行一个正则匹配,区分大小写不匹配
-
!~* 执行一个正则匹配,不区分大小写不匹配
-
^~ 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
-
= 普通字符精确匹配。也就是完全匹配
-
@ 定义一个命名的location,使用在内部定向时
location优先级
相同类型的表达式,字符串长的会优先匹配
优先级排序
- = 类型
-^~类型表达式 - 正则表达式(和*)类型
- 常规字符匹配类型,按前缀匹配
- 通用匹配(/),如果没有其他匹配,任何请求都会匹配到
rewrite与location比较
相同点
-
都能实现跳转
不同点 -
rewrit是在同一域名内更改获取资源的路径
-
location是对一类路劲做控制访问或反向代理,还可以proxy_pass到其他机器
rewrite会写在location里,执行顺序 -
执行server块里面的rewrite指令
-
执行location匹配
-
执行选定的location中的rewrite指令
location优先级的实例
- location ^~/lmages/ {
[ configuration E] 以/images/ 开头的地址,匹配符合后,停止往下匹配
} - location ~* .(gif|jpg|jpeg)$ {
[ configuration F ] 匹配所有以gif,jpg或jpeg结尾的请求,/images/下的图片会被
} 【configuration E 】处理,因为^~的优先级更高 - location ~ /images/abc {
[ configuration G] 最长字符匹配到/images/abc, 优先级最低
} - location ~ /images/abc/1.html {
[ configuration i] 如果和正则~ /images/abc/1.html相比,正则优先级更高
}
具体应用场景
- 基于域名跳转
实验环境:公司应某些原因将旧域名www.accp.com 更换成新域名www.yun.com
要求:旧域名不能废除、访问旧域名可以跳转到新域名上 参数不变
具体实验步骤如下:
使用yum进行安装
安装源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
直接用yum安装
yum install nginx -y
安装DNS
yum install bind -y
vim /etc/named.conf
vim/etc/named.rfc1912.zones
cp -p /var/named/named.localhost /var/named/accp.com.zone
vim /var/named/accp.com.zone
cp -p /var/named/accp.com.zone /var/named/yun.com.zone
启动服务关闭防火墙
systemctl start named
systemctl start nginx
systemctl stop firewalld.service
setenforce 0
查看域名www.accp.com