nginx的rewirte指令

rewrite指令

语法:rewrite regex replacement flag
默认值:none
使用环境:server,location,if

按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。
可以在重写指令后面添加标记。
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:

    last - 完成重写指令,之后搜索相应的URI或location,相当于apache里面的[L]标记,浏览器地址栏不变。
    break - 完成重写指令,不再执行后面的rewrite,浏览器地址栏不变。
    redirect - 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
    permanent - 返回301永久重定向,浏览器地址会显示跳转后的URL地址。

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,示例如下:

if( $host ~* www\.(.) ){
    set $host_without_www $1;
    rewrite  ^(.
)$  http://$host_without_www$1 permanent;
}

使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{……}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。

 

一般在跟location中(location /{…})或直接在server标签中编写rewrite规则,推荐使用last标记;在非根location中(location /cms/{…}),则使用break。

 

如果URI中含有参数,默认情况下参数会被自动附加到替换串上,你可以通过在替换串的末尾加上?标记来解决这一问题。  

如果我们将类似URL /photo/123456 重定向到 /path/to/photo/12/1234/123456.png

Rewrite “/photo/([0-9]{2})([0-9]{2})([0-9]{2})” /path/to/photo/$1/$1$2/$1$2$3.png;

注:如果正则表达式里面有花括号”{“或”}” ,应该使用双引号或单引号。