手把手教你,嘴对嘴传达------深入介绍Nginx的rewrite模块(理论加实验)

时间:2022-07-24
本文章向大家介绍手把手教你,嘴对嘴传达------深入介绍Nginx的rewrite模块(理论加实验),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、Rewrite

1、Rewrite跳转场景

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名上

服务端某些业务调整

2、Rewrite跳转实现

3、Rewrite实用场景

Nginx跳转需求的实现方式

  • 使用 rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用 location匹配再跳转

rewrite放在 server{},if{}, location{} 段中

4、Nginx正则表达式

二、Rewrite语法

1、基本语法构造

2、flag标记说明

3、last和break的不同

三、location字段

1、location格式

location = patt {} [精准匹配] ocation patt {} [一般匹配 ] location ~ patt {} [正则匹配]

2、正则匹配的常用表达式

3、location的优先级

相同类型的表达式,字符串长的会优先匹配 按优先级排列

  • = 类型
  • ^~ 类型表达式
  • 正则表达式类型
  • 常规字符串匹配类型,按前缀匹配
  • 通用匹配(/),如果没有其他匹配,任何请求都会匹配到

4、比较rewrite和location

相同点:都能实现跳转 不同点: rewrite是在同一域名内更改获取资源的路径 location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器

rewrite会写在location里,执行顺序

执行server块里面的rewrite指令 执行location匹配 执行选定的location中的rewrite指令

5、location优先级规则

匹配某个具体文件 ( location = 完整路径)>( location ^~ 完整路径)>( location ~* 完整路径)>( location ~ 完整路径)>( location完整路径)>( location /) 用目录做匹配访问某个文件 ( location = 目录)>( location ^~ 目录)>( location ~ 目录)> ( location ~* 目录)>( location 目录)>( location /)

6、location优先级的示例

location = / {	'//精确匹配 /,主机名后面不能带任何字符串'
    [configuraion A ]	
}

location / {	'//所有的地址都以/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配'
    [configuraion B ]
}

location /documents/ {		'//匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用'
    [configuraion C ]
}

location ~ /documents/abc {		'//匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才会起作用'
    [configuraion D ]
}

location ^~ /images/ {	'//以/images/开头的地址,匹配符合后,停止往下匹配'
    [configuraion E ]
}

location ~*.(gif|jpg|gpeg)$ {	'//匹配所有以 gif, jpg或jpeg结尾的请求, Images/下的图片会被 [configuration E]处理,因为^~的优先级更高'
    [configuraion F ]
}

location /images/abc {	'//最长字符匹配到 /images/abc,优先级最低'
    [configuraion G ]
}

location ~ /images/abc {	'//以/ Images/abc开头的,优先级次之'
    [configuraion H ]
}

location /images/abc/1.html {	'//如果和正则 ~ images/abc/1.htm相比,正则优先级更高'
    [configuraion I ]
}

二、实验

1、基于域名的跳转

需求 现在公司旧域名www.shang.com有业务需求有变更,需要使用新域名www.shangzhen.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

(1)环境准备

(2)yum安装nginx

yum安装nginx

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm	'//安装nginx源'
yum install nginx -y

(3)配置dns

####配置DNS
[root@localhost local]# yum install bind -y
[root@localhost local]# vim /etc/named.conf
修改监听地址:127.0.0.1修改为any,localhost修改为any
[root@localhost local]# vim /etc/named.rfc1912.zones 
zone "shang.com" IN {		'//添加此段'
        type master;
        file "shang.com.zone";
        allow-update { none; };
        zone "shangzhen.com" IN {		
        type master;
        file "shangzhen.com.zone";
        allow-update { none; };
};
[root@localhost local]# cd /var/named
[root@localhost named]# cp -p named.localhost shang.com.zone
[root@localhost named]# vim shang.com.zone 
www IN  A       192.168.110.132		'//末行添加'
[root@localhost named]# cp -p  shang.com.zone  shangzhen.com.zone

(4)win10访问nginx

(5)更改主配置文件

[root@localhost named]# vim /etc/nginx/conf.d/default.conf
    
 location / {	'//添加此段域名跳转'
                if ($host = "www.shang.com"){
                        rewrite ^/(.*)$ http://www.shangzhen.com/$1 permanent;
                }
        }
....

[root@localhost named]# systemctl start nginx.service 
[root@localhost named]# systemctl start named
[root@localhost named]# systemctl stop firewalld.service 
[root@localhost named]# setenforce 0

(6)测试

测试发现 rewrite模块已经生效

2、基于客户端IP访问跳转

(1)需求:

今天公司业务版本上线,所有P访问任何内容都显示一个固定维护页面,只有公司IP(192.168.110.132)访问正常

(2) 更改配置文件

[root@localhost named]# vim /etc/nginx/conf.d/default.conf 
...
    server {
        listen       80;
        server_name  www.shang.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #设置是否合法的IP标志
        set $rewrite false;        ////定义变量为false
        #判断是否为合法IP
        if ($remote_addr = "192.168.110.3"){    允许通过192.168.110.3
                set $rewrite true;    然后结束匹配  重新定义变量
        }
        #对非法IP进行判断打上标记
        if ($rewrite = false){        if判断 因为之前定义的变量 所以这条判断铁成立
                rewrite (.+) /main.html;    任意字符后面加/main.html
        }
        #匹配标记进行跳转站点
        location = /main.html {     接着上面的匹配  因为后面已经加/main.html了 
                root /usr/share/nginx/html;   //指向我站点下的main.index
        }
        
 cd /usr/share/nginx/html/
vim index.html
 <h1>this is false web</h1>

(3)测试

测试如下 因为我的win10 的IP地址是192.168.110.3 所以此时访问的到

此时更改我的允许访问的ip地址为192.168.110.111 这时只能访问到我站点目录下main.html

3、基于旧,新域名跳转并加目录

(1)需求:

基于旧域名跳转到新域名后面加目录,例如现在访问的是htp://bbs.old.com/post,现在需要将这个域名下面的发帖都跳转到http://www.new.com/bbs注意保持域名跳转后的参数不变

(2)具体配置

[root@localhost named]# vim /etc/nginx/conf.d/default.conf 
'//删除掉刚刚设置的基于IP地址访问的跳转配置'
    server {
        listen       80;
        server_name  bbs.shang.com;	'//修改域名'

        #charset koi8-r;

        #access_log  /var/log/nginx/www.shang.com.access.log  false;

        localtion /post {	'//添加跳转的网页'
                rewrite (.+) http://www.zhen.com.bbs$1 permanent;
        }
[root@localhost named]# vim /var/named/old.com.zone 
zhen IN  A       192.168.197.141		'//原本的www修改为bbs'
重启两个服务

4、参数匹配的跳转

(1)配置如下

if ($request_uri ~ ^/100-(100|200)-(d+).html$){
                rewrite (.*) http://www.shang.com permanent;
   }

(2)验证

5、访问任意一个页面跳转到首页

(1)需求

访问任意一个页面跳转到首页,即http://www.shang.com/abc/任意.php

(2)配置如下

 location ~* /abc/.*.php$ {
                rewrite (.*)  http://www.shang.com permanent;
        }

(3)验证

6、基于最普通URL请求的跳转

(1) 需求

访问一个具体的页面跳转到首页

(2)具体配置如下

 location ~* ^/abc/123.html {
                rewrite (.*) http://www.shang.com permanent;
        }

(3)验证