Nginx ---- Rewrite 和具体应用场景
一:Rewrite 跳转场景
-
URL看起来更规范、合理
-
企业会将动态URL地址伪装成静态地址提供服务
-
网址换新域名后,让旧的访问跳转到新的域名上
-
服务端某些业务调整
二:Rewrite 实用场景
1、Nginx跳转需求的实现方式
-
使用rewrite进行匹配跳转;
-
使用if匹配全局变量后跳转;
-
使用location 匹配再跳转
2、rewrite放在 server { },if { },location{ }段中;
3、对域名或参数字符串
-
使用 if 全局变量匹配;
-
使用 proxy_pass 反向代理
4、Rewrite 命令
rewrit <regex> <replacement> [flag];
'正则' ‘跳转后的内容’ ‘rewrite支持的flag标记’
flag标记说明
三:Location 分类
location = patt {} [精准匹配
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
1、正则表达式的常用表达式
2、location优先级
-
相同类型的表达式,字符串长的会优先匹配
-
按优先级排列
-
=类型
-
^~类型表达式
-
正则表达式(和*) 类型
-
常规字符串匹配类型,按前缀匹配
-
通用匹配(/),如果没有其它匹配,任何请求都会匹配到
-
3、比较rewrite和location
-
相同点 : 都能实现跳转
-
不同点
-
rewrite是在同一域名内更改获取资源的路径
-
location是对一类路径做控制访问或反向代理,还可以proxy_ pass到其他机器
-
rewrite会写在location里,执行顺序
-
执行server块里面的rewrite指令
-
执行location匹配
-
执行选定的location中的rewrite指令
四:应用场景
1、基于域名的跳转
示例:公司旧域名为www.do.com ,因业务需求有变更,需要使用新域名www.new.com 代替。 不能废除旧域名,从旧域名跳转到新域名,且保持参数不变。
1、下载官方源(rpm源)
[root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2、关闭防火墙, 直接安装nginx 和 bind
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install nginx bind -y
3、设置跳转域名,修改nginx配置文件
[root@localhost ~]# cd /etc/nginxconf.d/default.conf
[root@localhost conf.d]# vim default.conf
[root@localhost conf.d]# vim /etc/named.rfc1912.zones
[root@localhost conf.d]# cd /var/named
[root@localhost named]# ls
data named.ca named.localhost slaves
dynamic named.empty named.loopback
[root@localhost named]# cp -p named.localhost do.com.zone
[root@localhost named]# vim do.com.zone
[root@localhost named]# cp -p do.com.zone new.com.zone
[root@localhost named]# systemctl start named ‘开启named服务’
[root@localhost named]# systemctl start nginx ‘开启nginx服务’
在win10 客户机验证,输入新的域名。如果输入旧的域名会自动跳转到新的域名。
2、基于客户端IP访问跳转
示例:今天公司业务版本上线,所有的IP访问任何内容都显示一个固定维护页面,只有公司IP访问正常。(公司IP地址:192.168.34.159 PC客户端地址 :192.168.34.146)
1、修改nginx的配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf ‘进入配置文件’
[root@localhost ~]# systemctl start nginx ‘开启nginx服务’
2、给abc.html添加自定义页面内容
[root@localhost html]# vim abc.html
<html></head>
<meta charset="utf-8">
<h1>抱歉,网站维护中</h1>
</body></html>
通过公司的IP地址访问:
通过客户端访问:
3、基于旧域名跳转到新域名 并加目录
示例:公司由于业务变更,公司的域名为 bbs.do.com 变更为 www.do.com
1、在nginx配置文件中添加代码
[root@localhost html]# vim /etc/nginx/conf.d/default.conf
[root@localhost html]# cd /var/named
[root@localhost named]# vim do.com.zone
[root@localhost conf.d]# systemctl restart named
[root@localhost conf.d]# systemctl restart nginx
[root@localhost conf.d]# echo "nameserver 192.168.34.160" > /etc/resolv.conf
2、 在centos7 中访问输入bbs.do.com/post 会自动转换成 www.do.com/post , 此时域名跳转后的参数没有变还是bbs
4、基于参数匹配的跳转
示例:现在访问http://www.do.com/100-(100|200) -100.html 跳转到 http://www.do.com 页面。
1、修改nginx的主配置文件 ,在server段中添加一个 if 语句判断,匹配参数
[root@localhost named]# vim /etc/nginx/conf.d/default.conf
'添加这一段'
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){ ‘其中d代表数字 +代表数字匹配一次或多次 ’
rewrite (.*) http://www.do.com permanent; ‘匹配参数一次或多次,跳转到指定域名’
}
[root@localhost named]# vim do.com.zone ‘DNS 解析www’
[root@localhost named]# systemctl restart named
[root@localhost named]# systemctl restart nginx '开启服务'
2、在centos7 中验证 ,输入http://www.do.com/100-100-100.html 自动跳转到 www.do.com
5、基于目录下所有php结尾的文件跳转
示例:访问http://www.do.com/upload/1.php 时,自动跳转到首页www.do.com 。
1、修改nginx 配置文件
[root@localhost named]# vim /etc/nginx/conf.d/default.conf
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.do.com permanent;
}
2、在win10客户端验证,输入http://www.do.com/upload/c.php 会自动跳转到 www.do.com
6、基于最普通一条 url 请求的跳转
示例:在网页上访问一个具体的网址http://www.do.com/abc/test.html , 会自动跳转到首页 www.do.com 。
1、修改nginx主配置文件,server段中添加一个location 段,匹配条件跳转
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
location ~* ^/abc/test.html{ '指定一个页面'
rewrite (.+) http://www.accp.com permanent; ‘自动跳转到首页’
}