美文网首页
2020-03-24 Nginx Rewrite

2020-03-24 Nginx Rewrite

作者: 阿丧小威 | 来源:发表于2020-03-24 21:55 被阅读0次

    1. 什么是Nginx Rewrite

    和Apache等Web服务软件一样,Nginx Rewrite的主要功能也是实现URL地址重写,Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配,前面在安装Nginx软件时就已经安装了这个PCRE软件,以及让Nginx支持Rewrite的功能,默认参数编译Nginx就会安装支持Rewrite的模块,但是,也必须要PCRE软件的支持,Nginx Rewrite的典型企业应用就是伪静态功能的实现。

    2. Nginx Rewrite语法

    2.1 Rewrite指令语法

    指令语法:Rewrite regex replacement [flag];
    默认值:none;
    应用位置:server、location、if。
    rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:

    rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
    

    在上述指令中,Rewrite为固定关键字,表示开启一条Rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,匹配所有,匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,结尾permanent;表示永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。

    2.2 regex常用正则表达式说明

    下表为regex常用正则表达式字符的一部分。

    regex常用正则表达式字符1 regex常用正则表达式字符2

    2.3 Rewrite指令结尾的flag标记说明

    Rewrite指令最后一项参数为flag标记该标记说明见下表。

    Rewrite指令最后一项参数flag标记的说明

    在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
    last和break标记的实现功能类似,但两者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条Rewrite规则执行完毕后,会对其所在的server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

    3. Nginx Rewrite的企业应用场景

    Nginx的Rewrite功能在企业里应用非常广泛:

    • 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
    • 为了让搜索引擎收录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
    • 网站换新域名后,让旧的域名的访问跳转到新的域名商上,如让京东的360buy换成了jd.com。
    • 根据特殊变量、目录、客户端的信息进行URL跳转等。

    4. Nginx Rewrite 301跳转

    以往我们是通过别名的方式实现etiantian.orgwww.etiantian.org访问同一个地址的,事实上,除了这个方式以外,还可以使用Nginx Rewrite 301跳转的方式实现。实现的配置如下:

    [root@web01 conf]# cat extra/01_www.conf 
        server {
            listen       80;
            server_name  etiantian.org;
        rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
    ---当用户访问etiantian.org及下面的任意内容时,都会通过这天Rewrite跳转到www.etiantian.org对应的地址
        }
        server {
        listen       80;
        server_name  www.etiantian.org;
            location / {
                root   html/www;
                index  index.html index.htm;
            }
            access_log logs/access_www.log main gzip buffer=12k flush=5s;
        }
    

    浏览器访问效果如下图所示:

    访问前的地址 访问后的地址

    5. 实现不同域名的URL跳转

    例1:实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/oldboy.html
    外部跳转时使用这种方法,浏览器地址会变为跳转后的地址,另外,要实现设置http://www.etiantian.org/blog/oldboy.html有结果输出,不然会出现401等权限错误。
    配置Nginx rewrite规则
    跳转前http://blog.etiantian.org对应站点的配置如下:

    [root@web01 conf]# cat extra/03_blog.conf 
        server {
            listen       80;
            server_name  blog.etiantian.org;
            location / {
                root   html/blog;
                index  index.html index.htm;
            }
    ---下面4行为要配置的规则内容
        if ( $http_host ~* "^(.*)\.etiantian\.org$") {
            set $domain $1;
            rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break;
            }
        access_log logs/access_blog.log main;
        }
    

    跳转后http://www.etiantian.org/blog/oldboy.html地址对应的站点配置如下:

    [root@web01 conf]# cat extra/01_www.conf 
        server {
        listen       80;
        server_name  www.etiantian.org etiantian.org;
            location / {
                root   html/www;
                index  index.html index.htm;
            }
            access_log logs/access_www.log main gzip buffer=12k flush=5s;
        }
    

    客户端访问测试效果
    注意:对应的html文件要事先创建好。

    访问前的地址 访问后的地址

    例2:某公司早先只有一个域名www.etiantian.org,因此,将bbs论坛部署到了www.etiantian.org域名下的bbs目录下了,现在想启用bbs.etiantian.org做bbs的域名,需要实现访问http://www.etiantian.org/bbs跳转到http://bbs.etiantian.org
    1)在etiantian.org下设置Nginx Rewrite规则。

    [root@web01 conf]# cat extra/01_www.conf 
        server {
        listen       80;
        server_name  www.etiantian.org etiantian.org;
            location / {
                root   html/www;
                index  index.html index.htm;
            }
        rewrite ^(.*)/bbs/ http://bbs.etiantian.org break;
            access_log logs/access_www.log main gzip buffer=12k flush=5s;
        }
    [root@web01 conf]# cat extra/02_bbs.conf 
        server {
        listen       80;
            server_name  bbs.etiantian.org;
            location / {
                root   html/bbs;
                index  index.html index.htm;
            }
        access_log logs/access_bbs.log main;
        }
    

    2)访问前后的效果对比。

    访问前的地址 访问后的地址

    **有关Rewrite特殊flag标记last与break的说明:
    在跟location(即location/{……})中或者server{……}标签中编写Rewrite规则,建议使用last标记,而在普通的Location(例location /lodboy/ {……})或if{}中编写Rewrite规则,则建议使用break标记。
    企业场景中运维人员需要掌握多少Rewrite技术?
    简单的URL跳转,运维人员可以直接搞掂,复杂规则,如伪静态实现是和业务相关的,一般是开发人员写好并测试成功,然后发给运维到正式环境部署执行。

    相关文章

      网友评论

          本文标题:2020-03-24 Nginx Rewrite

          本文链接:https://www.haomeiwen.com/subject/ikboyhtx.html