一、Rewrite实际场景
- Nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配再跳转
- rewrite放在server{},if{},location{}段中
- location只对域名后边的除去传递参数外的字符串起作用
- 对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_pass反向代理
- 常用的正则表达式元字符
字符 | 说明 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束为止 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除“\n”之外的任何单个字符 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
- Rewrite命令
rewrite <regex> <replacement> [flag];
PS:
<regex>:匹配正则
<replacement>:跳转后的内容
[flag]:rewrite支持的flag标记
- flag标记说明
标记 | 说明 |
---|---|
last | 相当于Apache的[L]标记,表示完成rewrite |
break | 本条规则匹配完成即终止,不再匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url |
- last和break比较
last | break | |
---|---|---|
适用场景 | 一般写在server和if中 | 一般使用再location中 |
URL匹配 | 不终止重写后的url匹配 | 终止重写后的url、匹配 |
- location分类
location = patt {} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
- 正则匹配的常用表达式
标记 | 说明 |
---|---|
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location |
= | 普通字符精确匹配,也就是完全匹配 |
@ | 定义一个命名的location,使用在内部定向时 |
- location优先级
-
相同类型的表达式,字符串长的会优先匹配
-
按优先级排列
(1)= 类型
(2)^~类型表达式
(3)正则表达式(~ 和 ~*)类型
(4)常规字符串匹配类型,按前缀匹配
(5)通用匹配(/),如果没有其他匹配,任何请求都会匹配到
-
比较rewrite和location
1、相同点:都能实现跳转
2、不同点:rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
3、rewrite会写在location里,执行顺序
执行server快里面的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
-
location优先级规则
(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径)
> (location 完整路径) > (location /)
二、实现需求
- 实验环境:VMware Workstation 15.5、Centos 7.6(及自带火狐浏览器)、X Shell 6
需求一:基于域名的跳转
-
需求:公司旧域名,www.gongsi.com,因业务需求有变更,需要使用新域名www.newgongsi.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与DNS服务
[root@localhost ~]# yum -y install nginx
[root@localhost ~]# yum -y install bind
3、将www.gongsi.com与www.newgongsi.com两个域名分别做正向DNS解析,配置完成后启动DNS服务(在先前的博文中已多次详细讲解DNS的配置方法,请参考之前文章,这里就不再赘述了)
4、配置nginx服务的域名,并添加实现域名跳转的代码
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf ## 编辑配置文件
实现域名跳转:
location / {
if ($host = 'www.gongsi.com') {
rewrite ^/(.*)$ http://www.newgongsi.com/$1 permanent;
}
root /usr/share/nginx/html;
index index.html index.html;
}
5、重启nginx服务,并关闭防火墙
[root@localhost ~]# systemctl restart nginx ##重启nginx服务
[root@localhost ~]# iptables -F ## 清空防火墙规则
[root@localhost ~]# setenforce 0 ## 关闭系统核心防护
6、另开一台虚拟机,将DNS服务器设置指向192.168.50.134(本次实验的DNS服务器地址)
## 如果是windows客户机直接在网卡中进行设置
## 如果是Linux虚拟机则可以使用命令进行设置或直接编辑resolv.conf配置文件写入
[root@localhost ~]# echo "nameserver 192.168.50.134" > /etc/resolv.conf
7、打开浏览器输入www.gongsi.com回车,可以发现浏览器会自动跳转到www.newgongsi.com上
需求二:基于客户端IP访问跳转
- 需求:今天公司业务版本上线,所有IP访问任何内容都显示一个固定维护页面,只有公司IP访问正常
- 操作步骤:
1、编辑并修改nginx配置文件,并在其中添加相应代码
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf ## 编辑配置文件
## 添加如下内容:
set $rewrite true;
if ($remote_addr = "192.168.50.139"){
set $rewrite false;
}
if ($rewrite = true) {
rewrite (.+) /error.html;
}
location = /error.html {
root /usr/share/nginx/html;
}
2、进入站点目录,创建一个error.html,非允许IP访问则自动跳转该页面
[root@localhost html]# cd /usr/share/nginx/html ## 进入站点目录
[root@localhost html]# vim error.html ## 创建页面文件
写入如下内容:
<h1>wei hu zhong</h1>
3、重启nginx服务
[root@localhost html]# systemctl restart nginx
4、在客户机上清除浏览器缓存后再次访问站点www.gongsi.com可以发现跳转的是刚才写入的error.html中的内容
需求三:基于旧、新域名跳转并加目录
- 需求:将域名http://bbs.gongsi.com下面的发帖全部都跳转到http://www.gongsi.com/bbs,且域名跳转后保持参数不变
- 操作如下:
1、编辑nginx配置文件,修改ServerName项
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf ## 编辑配置文件
## 将原先的server_name www.gongsi.com;替换成 bbs.gongsi.com
## 并添加如下内容:
location /post {
rewrite (.+) http://www.gongsi.com/bbs$1 permanent;
}
2、修改DNS区域数据配置文件中的解析内容,将其中的www替换为bbs
3、重启DNS及nginx服务
[root@localhost html]# systemctl restart named
[root@localhost html]# systemctl restart nginx