一、须知

Nginx rewrite规则的主要功能是实现URL地址的重写,它需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配

二、语法及其配置

1、指令语法

rewrite regex replacement [flag];

应用位置:server、location、if

释义:rewrite指令根据regex(正则表达式)里的内容定向到replacement部分,结尾是flag标记。

下面是一个简单的URL rewrite跳转的例子:

rewrite    ^/(. *)    http://www.baidu.com/$1  permanent ;

            regex          replacement            flag

      上面的rewrite规则表示匹配所有,匹配成功后跳转到http://www.baidu.com/$1。这里的$1是取前面regex部分括号里的内容,结尾的permanent是永久重定向301的标记

 

参数flag标记的说明:

                                      flag标记符号                                                                             说明

                                            last                                          本条规则匹配完成后,继续向下匹配新的location URI规则

                                          break                                         本条规则匹配完成即终止,不再匹配后面的任何规则

                                        redirect                                       返回302临时重定向,浏览器地址栏依旧是旧网站的网址,内容却是新网站

                                      permanent                                    返回301临时重定向,浏览器地址栏会显示跳转后的URL地址

last和break用来实现URL的重写,浏览器地址栏中的地址不变,redirect和permanent用来实现URL的跳转

    建议:在根location或server标签中编写rewrite规则,建议使用last标记,在普通location或if语句中编写rewrite规则,则建议使用break标记。

2、redirect和permanent的区别:

(1)permanent:301永久重定向,新网站完全取代旧网站,旧网址的排名等完全清零,301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

(2)redirect:302临时重定向,旧网站依然存在

(3)例如:我们之前网站的域名是 www.haha.com,现在替换成了 www.xixi.com。但是用户并不知道域名改了,所以还是在浏览器里输入 www.haha.com,Web服务器(apache 或者 ngnix)在收到请求后,在响应中包含:

  • 状态码 301 及 www.xixi.com。用户的浏览器在收到响应后,自动将输入栏网址改变为 www.xixi.com。

或者

  • 状态码 302 及 www.xixi.com。因为302只是临时的,所以用户的浏览器在收到响应后,输入栏仍是显示www.haha.com,但是显示的是 www.xixi.com的内容

3、rewrite规则在企业的应用场景

(1)可以调整用户浏览的URL,使其看起来更规范

(2)做伪静态网页

(3)网站更换新域名之后,让旧域名的访问跳转到新域名上

(4)根据特殊变量、目录、客户端的信息进行URL跳转等。

4、if语句实现不同域名的URL跳转(if语句的放置位置及其效果的表现和优先级暂时还不清楚)

if($http_host ~* "^(.*)\.xixi\.com$"){
//将$http_host变量中的内容和后面的正则表达式不区分大小写进行匹配,若匹配成功则返回真。
set $domain $1;
//$1:为上面第一个括号里面的内容,set命令的作用是为变量$domain赋予新的变量值
rewrite ^(.*) http://www.haha.com/$domain/index.html
//很多人可能都会纳闷,为什么这里可以匹配所有,因为前面if条件语句,已经起到了筛选的作用,所以这里可以直接匹配所有
}

$http_host:目标的URL地址