如何配置Nginx的rewrite?(Web服务器群集,各种nginx的rewrite实例配置,rewrite的语法,location的详解)

前言

  • 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{} 段中
  • 对域名或参数字符串
    • 使用if全局变量匹配
    • 使用 proxy_pass反向代理

1.4:你还记得Nginx正则表达式吗?

mark

二:Rewrite命令

2.1:rewrite语法是什么?

mark

2.2:flag标记说明

mark

2.3:last和break比较有什么不同?

mark

2.4:什么是正则表达式?

  • 处理字符串的工具,使用各种规则来处理,而正则表达式就是规则

三:location

3.1:location有哪些分类?

  • location = patt {} [精准匹配]
  • ocation patt {} [一般匹配 ]
  • location ~ patt {} [正则匹配]
3.1.1:正则匹配的常用表达式

mark

3.2:你了解location的优先级吗?

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

3.3:rewrite和 location有什么不同?

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

3.4:location优先级规则

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

3.5: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 ]
}

四:应用实例

  • 环境准备

  • 手工编译安装nginx(实验中使用的是此nginx)

    或者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
    
  • VMware软件

  • 一台centos7服务器(IP地址为192.168.197.141)

  • 一台Windows主机(IP地址为192.168.197.128)

4.1:基于域名的跳转

4.1.1:需求
  • 现在公司旧域名www.old.com有业务需求有变更,需要使用新域名www.new.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变
4.1.2:配置
  • 配置Windows主机

    mark

  • 配置centos服务器

    ####配置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 "old.com" IN {		'//添加此段'
            type master;
            file "old.com.zone";
            allow-update { none; };
    zone "new.com" IN {		'//添加此段'
            type master;
            file "new.com.zone";
            allow-update { none; };
    };
    [root@localhost local]# cd /var/named
    [root@localhost named]# cp -p named.localhost old.com.zone
    [root@localhost named]# vim old.com.zone 
    www IN  A       192.168.197.141		'//末行添加'
    [root@localhost named]# cp -p old.com.zone new.com.zone
    [root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
        server {
            listen       80;
            server_name  www.old.com;	'//修改域名'
            ....
     location / {	'//添加此段域名跳转'
                    if ($host = "www.old.com"){
                            rewrite ^/(.*)$ http://www.new.com/$1 permanent;
                    }
            }
    ....
    [root@localhost named]# vim /usr/local/nginx/html/index.html 
    <h1>this is old web</h1>	'//修改主页内容'
    [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
    
    
4.1.3:验证

mark

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

4.2.1:需求:
  • 今天公司业务版本上线,所有P访问任何内容都显示一个固定维护页面,只有公司IP(192.168.197.128)访问正常
4.2.2:centos服务器配置
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.old.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #设置是否合法的IP标志
        set $rewrite false;
        #判断是否为合法IP
        if ($remote_addr = "192.168.197.128"){
                set $rewrite true;
        }
        #对非法IP进行判断打上标记
        if ($rewrite = false){
                rewrite (.+) /main.html;
        }
        #匹配标记进行跳转站点
        location = /main.html {
                root /usr/local/nginx/html;
        }
        ....
[root@localhost named]# vim /usr/local/nginx/html/main.html
<h1>this is false web</h1>
重启nginx服务
4.2.3:测试
  • 使用Windows(IP地址为192.168.197.128)测试

    mark

        #判断是否为合法IP
        if ($remote_addr = "192.168.197.129"){	'//变更掉合法ip'
                set $rewrite true;
        }
  • 再次使用Windows(IP地址为192.168.197.128)查看
  • mark

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

4.3.1:需求:
  • 基于旧域名跳转到新域名后面加目录,例如现在访问的是htp://bbs.old.com/post,现在需要将这个域名下面的发帖都跳转到http://www.new.com/bbs注意保持域名跳转后的参数不变
4.3.2:配置
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
'//删除掉刚刚设置的基于IP地址访问的跳转配置'
    server {
        listen       80;
        server_name  bbs.old.com;	'//修改域名'

        #charset koi8-r;

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

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

mark

4.4:基于参数匹配的跳转

4.4.1:需求
  • 例如现在访问http://www.old.com/100-(100|200)-100.html跳转到http://www.new.com页面
4.4.2:配置
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
'//删除掉刚刚设置的基于域名添加目录访问的跳转配置'
        listen       80;
        server_name  www.old.com;

        #charset koi8-r;

        #access_log  /var/log/nginx/www.old.com.access.log  false;
        if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
                rewrite (.*) http://www.new.com permanent;
        }
...
[root@localhost named]# vim /var/named/old.com.zone 
www IN  A       192.168.197.141	'//刚刚设置的bbs修改为www'
重启服务
4.4.3:验证

mark

4.5:基于最普通URL请求的跳转

4.5.1:需求
  • 访问一个具体的页面跳转到首页
4.5.2:配置
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
'//删除掉刚刚设置的基于参数访问的跳转配置'
        location ~* ^/abc/123.html {
                rewrite (.+) http://www.old.com permanent;
        }
重启服务
4.5.3:验证

mark

4.5.4:需求
  • 访问任意一个页面跳转到首页,即http://www.old.com/abc/任意.php
4.5.5:配置
[root@localhost named]# vim /usr/local/nginx/conf/nginx.conf
        location ~* ^/abc/.*\.php$ {
                rewrite (.+) http://www.old.com permanent;
        }
重启服务
4.5.6:验证

mark

发布了94 篇原创文章 · 获赞 60 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/103707677