Web服务器群集 ---- Nginx之Rewrite跳转

Nginx ----Rewrite跳转

前言

  • 该ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置

一:Rewrite

1.1:Rewrite跳转场景

  • URL看起来更规范、合理
  • 企业会将动态URL地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上
  • 服务端某些业务调整

1.2:Rewrite跳转实现

mark

1.3:Rewrite实际场景

  • Nginx跳转需求的实现方式
    使用 rewrite进行匹配跳转
    使用if匹配全局变量后跳转
    使用 location匹配再跳转

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

    location只对域名后面的除去传递参数外的字符起作用

  • 对域名或参数字符串
    使用if全局变量匹配
    使用 proxy_pass反向代理

1.4:Nginx正则表达式匹配

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
匹配前面的字符零次或一次
.匹配除\n之外的任何单个字符,使用诸如"[.\n]“之类的模式,可匹配包括”\n"在内的任意字符
\d匹配纯数字 [0-9]
{n}重复多次
{n,}重复n次或更多次
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或A-Z大写字母的任意一个

二: Rewrite命令

2.1: 语法

  • 语法:
    rewrite   <regex>       <replacement>            [flag];
                正则          跳转后的内容          rewrite支持的flag标记
    

    flag标记说明:

    标记说明
    last相当于Apache的[L]标记,表示完成rewrite
    break本条规则匹配完成即终止,不再匹配后面的任何规则
    redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
    permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url
  • last和break比较:

    lastbreak
    使用场景一般写在server和if中一般使用在location中
    URL匹配不终止重写后的url匹配终止重写后的url匹配

三:location

3.1:location分类

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

3.2 : 正则匹配的常用表达式

  • 标记说明
    ~执行一个正则匹配,区分大小写
    ~*执行一个正则匹配,不区分大小写
    !~执行一个正则匹配,区分大小写不匹配
    !~*执行一个正则匹配,不区分大小写不匹配
    ^~普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
    =普通字符精准匹配。也就是完全匹配
    @定义一个命名的location,使用在内部定向时

3.3: location的优先级

  • **相同类型的表达式,字符长的会优先匹配**
    **按优先级排列**
        = 类型
        ^~ 类型表达式
        正则表达式(~~*)类型
        常规字符串匹配类型,按前缀匹配
        通常匹配(/),如果没有其他匹配,任何请求都会匹配到
    

3.4: Rewrite 和 location比较

  • **相同点**
            都能实现跳转
    **不同点**
            rewrite是在同一域名内更改获取资源的路径
            location是对一类路径做控制访问或方向代理,还可以proxy_pass到其他机器
    **rewrite会写在location里执行顺序**
            执行server块里面的rewrite指令
            执行location匹配
            执行选定的location中的rewrite指令
    

3.5: location 优先级规则

  • 匹配某个具体文件:
    (location = 完整路径)>(location ^~完整路径)>(location ~*完整路径)>(location ~完整路径)>(location 完整路径)>(location /)

  • 用目录做匹配访问某个文件:
    (location = 目录)>(location ^~目录/)>(location ~ 目录)>(location ~* 目录)>(location 目录)>(location /)

3.6: location优先级的示例

  • 1.精确匹配/,主机名后面不能带任何字符串
    location = / {
      [ configuration A ]     
    }
    
    2.所有的地址都以/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配
    location  / {
      [ configuration B ]     
    }
    
    3.匹配任何以/documents/开头的地址,当后面正则表达式没有匹配到时,才起作用
    location /documents/ {
      [ configuration C ]
    }
    
    4.匹配任何以/documents/abc开头的地址,当后面正则表达式没有匹配到时,才会起作用
    location ~ /documents/abc {
      [ configuration D ]
    }
    
    5./images/开头的地址,匹配符合后,停止往下匹配
    location ^~ /images/ {
      [ configuration E ]
    }
    
    6.匹配所有以gif结尾的请求,/images/下的图片会被[configuration E]处理,因为^~的优先级更高
    location ~* \.(gif|jpg|jpeg)$ {
      [ configuration F ]
    }
    
    7.最长字符匹配到/images/abc,优先级最低
    location /images/abc {
      [ configuration G ]
    }
    
    8./images/abc开头的,优先级次之
    location ~ /images/abc {
      [ configuration H ]
    }
    
    9.如果和正则~/images/abc/1.html相比,正则优先级更高
    location /images/abc/1.html {
      [ configuration I ]
    }
    

四: 跳转应用示例

4.1基于域名的跳转

  • 现在公司旧域名www.kgc.com有业务需求有变更,需要使用新域名www.newkgc.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变
[root@promote ~]# iptables -F
[root@promote ~]# setenforce 0
[root@promote ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm      '安装nginx源'
[root@promote ~]# yum install -y nginx
[root@promote ~]# rpm -q nginx
nginx-1.18.0-1.el7.ngx.x86_64
[root@promote ~]# vim /etc/nginx/conf.d/default.conf 
  server_name  www.kgc.com;          //修改

  #charset koi8-r;
  access_log  /var/log/nginx/www.kgc.com.access.log  main;    //修改
[root@promote ~]# yum install -y bind
[root@promote ~]# vim /etc/named.conf          //修改两个any
[root@promote ~]# vim /etc/named.rfc1912.zones 
zone "kgc.com" IN {
        type master;
        file "kgc.com.zone";
        allow-update { none; };
};
zone "newkgc.com" IN {        type master;
        file "newkgc.com.zone";
        allow-update { none; };
}; 
[root@promote ~]# cd  /var/named
[root@promote named]# ls
data     named.ca     named.localhost  slaves
dynamic  named.empty  named.loopback
[root@promote named]# cp -p named.localhost kgc.com.zone    //保持属性复制
[root@promote named]# vim kgc.com.zone 
www IN A 192.168.100.150
[root@promote named]# systemctl start named
[root@localhost named]# vim /etc/nginx/conf.d/default.conf
.......
location / {      '添加域名跳转'
        if ($host = 'www.kgc.com') {
          rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
        }
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
[root@promote named]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@promote named]# systemctl start nginx
[root@promote named]# netstat -ntap | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      69344/nginx: master 
[root@promote named]# netstat -ntap | grep named
tcp        0      0 192.168.100.150:53      0.0.0.0:*  

mark

mark

mark

以上实现老域名向新域名的跳转功能

4.2: 基于客户端IP访问跳转

  • 今天公司业务版本上线,所有P访问任何内容都显示一个固定维护页面,只有公司IP(192.168.100.10)访问正常
[root@localhost html]# vim /etc/nginx/conf.d/default.conf 
   listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/www.kgc.com.access.log  main;
    #设置是否合法的IP标志
    set $rewrite true;
    #判断是否为合法IP
    if ($remote_addr = "192.168.100.10"){       
      set $rewrite false;
    }
    #对非法IP进行判断打上标记
    if ($rewrite = true) {
      rewrite (.+) /error.html;
      }
    location = /error.html {
      root /usr/share/nginx/html;
      }
    #匹配标记进行跳转站点
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
[root@localhost ~]# vim /usr/share/nginx/html/error.html
<h1>this is error web</h1>
[root@localhost html]# systemctl restart nginx

mark

mark

公司内部地址访问

mark

mark

4.3: 基于旧,新域名跳转并加目录

  • 基于旧域名跳转到新域名后面加目录,例如现在访问的是htp://bbs.kgc.com/post,现在需要将这个域名下面的发帖都跳转到http://www.kgc.com/bbs注意保持域名跳转后的参数不变
[root@localhost html]# vim /etc/nginx/conf.d/default.conf    
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/www.kgc.com.access.log  main;
    location /post {           '//添加跳转的网页'
        rewrite (.+) http://www.kgc.com/bbs$1 permanent;
    }
[root@localhost html]# vim /var/named/kgc.com.zone 
bbs IN  A       192.168.100.150

这里测试不能用win10的浏览器进行测试,需要用火狐浏览器

我们新开一台Centos虚拟机进行测试 地址192.168.100.160

测试客户机
root@localhost ~]# echo "nameserver 192.168.100.150" > /etc/resolv.conf   //定义域名解析服务器地址
[root@localhost ~]# ping bbs.kgc.com
PING bbs.kgc.com (192.168.100.150) 56(84) bytes of data.
64 bytes from 192.168.100.150 (192.168.100.150): icmp_seq=1 ttl=64 time=0.414 ms
64 bytes from 192.168.100.150 (192.168.100.150): icmp_seq=2 ttl=64 time=2.77 ms
64 bytes from 192.168.100.150 (192.168.100.150): icmp_seq=3 ttl=64 time=1.72 ms

mark

mark

这里没有创建abc.html 所有跳转后无法显示页面

4.4: 基于参数匹配的跳转

  • 例如现在访问http://www.kgc.com/100-(100|200)-100.html跳转到http://www.kgc.com页面
[root@promote named]# vim /etc/nginx/conf.d/default.conf
'//删除掉刚刚设置的基于域名添加目录访问的跳转配置'
    #charset koi8-r;
    access_log  /var/log/nginx/www.kgc.com.access.log  main;
    if ($request_uri ~ ^/100-(100|200)-(\d+).html){
       rewrite (.*) http://www.kgc.com permanent;
    }

mark

mark

4.5: 基于目录下所有php文件的跳转

  • 访问php文件跳转到首页www.kgc.com
[root@promote ~]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/www.kgc.com.access.log  main;
    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.kgc.com  permanent;
    }
[root@promote ~]# systemctl restart nginx

mark

mark

4.6: 基于最普通url请求的跳转

  • 访问一个普通的页面跳转到首页
[root@promote named]# vim /etc/nginx/conf.d/default.conf
......
    #charset koi8-r;
    access_log  /var/log/nginx/www.kgc.com.access.log  main;
    location ~* ^/abc/test.html{
        rewrite (.+) http://www.kgc.com permanent;
    }

mark

mark

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值