介绍:

和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

    rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite    <regex>    <replacement>    [flag];

    关键字      正则        替代内容          flag标记

 

    关键字:其中关键字error_log不能改变

    正则:perl兼容正则表达式语句进行规则匹配

    替代内容:将正则匹配的内容替换成replacement

    flag标记:rewrite支持的flag标记

 

flag标记说明:

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

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

redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

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

rewrite参数的标签段位置:

 

 

server,location,if

rege常用正则表达式说明:

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到repla部分,结尾是flag标记,下面是一个简单的URL rewrite跳转的例子:
rewrite ^/(.*) http://www/dmtest1.com/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一天rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后
跳转到http://www.dmtest1.com/$1。这里的$1是前面(rege)部分括号里面的内容,结尾的permanent;是永久301重定向标记,
即跳转到后面的http://www.dmtest1.com/$1地址上。

 

 

\           将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。例如,"\n"匹配一个换行符,序列"\\"和"$"则匹配"$"
^           匹配输入字符串的起始位置,如果设置了RegExp对象的Multiline属性,^也匹配"\n"或"r"之后的位置
$           匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$也匹配"\n"或"\r"之前的位置
*           匹配前面的字符零次或多次,例如,ol*能匹配"o"及"olll",*等价于{0,}
+           匹配前面的字符一次或多次,例如,"ol+"能匹配"ol"及"oll",但不能匹配"o",.+等价于{1,}
?           匹配前面的字符零次或一次,例如,"do(es)?"可以匹配"do"或"does"中的"do",.?等价于{0,1}
            当该字符紧跟在任何一个其他限制符(*,+?,{n},{n},{n,m})的后面时,匹配模式是非贪婪模式的,非贪婪模式会尽可能少地匹配所搜索的字符串,
       而默认的贪婪模式则会尽可能多地匹配所搜索的字符串,例如,对于字符串"oooo","o+?"将匹配单个"o",而"o+"将匹配所有"o"
.           匹配除"\n"之外的任何单个字符,要匹配包括"\n"在内的任何字符,请使用像"[.\n]"这样的模式
(pattern)   匹配括号内的pattern,并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容。要匹配圆括号字符,请使用"\("或"\)"

 

 

 

 

例子:

server {

        listen 80;

        server_name abc.com;

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

}

 

 

server {

        listen 80;

        server_name www.abc.com;

        location / {

                root /data/www/www;

                index index.html index.htm;

        }

        error_log    logs/error_www.abc.com.log error;

        access_log    logs/access_www.abc.com.log    main;

}

或者

server {

        listen 80;

        server_name abc.com www.abc.com;

        if ( $host != 'www.abc.com'  ) {

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

        }

        location / {

                root /data/www/www;

                index index.html index.htm;

        }

        error_log    logs/error_www.abc.com.log error;

        access_log    logs/access_www.abc.com.log    main;

}

#打开浏览器访问abc.com

#页面打开后,URL地址栏的abc.com变成了www.abc.com说明URL重写成功。

 

下面是可以用来判断的表达式:-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行

下面是可以用作判断的全局变量:

参数

说明

$args

这个变量等于请求行中的参数。

$content_length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

客户端agent信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_body_file

客户端请求主体信息的临时文件名。

$request_method

客户端请求的动作,通常为GET或POST。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由root或alias指令与URI请求生成。

$query_string

与$args相同。

$scheme

HTTP方法(如http,https)。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri

不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri

与$uri相同。

 


nginx的rewrite功能在企业里的应用非常广泛:

1、可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。

2、为了让搜索引擎收藏网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。

3、网站换新域名后,让旧域名的访问跳转到新域名上,例如让京东的360buy换成jd.com.

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

 

实现不同域名的跳转

server {
        listen       80;
        server_name  blog.dmtest.com;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
        if ( $http_host ~* "^(.*)\.dmtest\.com$) {
            set $domain $1;
            rewrite ^(.*) http://www.dmtest.com/$domain/dm.html break;
            }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }