首页 > 代码库 > nginx指令之rewrite
nginx指令之rewrite
语法:rewrite regex replacement flag
默认值:none
使用环境:server,locacation,if
该指令根据表达式来重定向URL,或者修改字符串。指令根据配置文件中的顺序来执行。
注意:重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,代码如下:
if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ permanent; }
如果替换串以http://开头,将会才用301或者302跳转进行URL重定向。
nginx的rewrite规则参考:
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
rewrite指令的最后一项参数为flag标记,支持的flag标记有以下四种:
last 相当于apache里的L标记,表示完成rewrite
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL。
permanent返回301永久重定向,浏览器地址会显示跳转后的URL。
nginx rewrite可以用到的全局变量:
$args
$content_length
$content_type
$document_root
$document_uri
$hosts
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
#知识普及
URL是全球资源定位符的英文所写,您平时上网时在IE浏览器中输入的那个地址就是URL。比如:网易 就是一个URL。 URI是Web上可用的每种资源 - HTML文档、图像、视频片段、程序,由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。 URL的格式由下列三部分组成: 第一部分是协议(或称为服务方式); 第二部分是存有该资源的主机IP地址(有时也包括端口号); 第三部分是主机资源的具体地址。 URI一般由三部分组成: 访问资源的命名机制。 存放资源的主机名。 资源自身的名称,由路径表示。
在以上的标记中,last和break用来实现URI重写,浏览器地址栏的URL地址不变,但在服务器端访问的路径发生了改变。
redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite匹配完成后,终止匹配,不再匹配后面的规则。例如下面这个例子,就必须使用break标记,使用last标记会导致死循环。
location /cms/ { proxy_pass rewrite ^/cms/(.*)\.html$ /cms/index.html break; }
因此,一般在根location中,即(location / {...})或直接在server标签中编写rewrite规则,推荐使用last标记,在非根location中,例如location /cms/{...},则使用break标记。例如:
server { ... rewrite ^(/download/.*)/media/(.*)\..$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..$ $1/mp3/$2.ra last; return 403; ... } location /download/ { rewrite ^(/download/.*)/media/(.*)\..$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..$ $1/mp3/$2.ra break; return 403; }
如果被替换的URI中含有参数,类似/app/test.php?id=5之类的(URI),默认情况下参数会被自动附加到替换串上,你可以通过在替换串的末尾加上?标记来解决这一问题。
rewrite ^/user/(.*)$ /show?user=$1 last;
下面我们来比较一下,不加?标记和加上?标记的URL跳转区别:
rewrite ^/test(.*)$ permanent;
访问 www.baidu.com/test?id=5 经过301跳转后的URL地址为www.baidu.com/home?id=5
rewrite ^/test(.*)$ http://www.baidu.com/home? permanent;
访问 www.baidu.com/test?id=5 经过301跳转后的URL地址为www.baidu.com/home
# 对花括号{} 来说,它既能用在重定向的正则表达式里,也能用在配置文件里分割代码块。为了避免冲突,正则表达式里如果带花括号,应该用双引号或者单引号包围,比如:类似这样的url
/photo/123456.01
重定向到
/path/to/photos/12/1234/picture.01.png
可以用以下方法:
rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" /path/to/photos/$1/$1$2/$1$2$3.png
其余链接http://304076020.blog.51cto.com/7503470/1424073
本文出自 “技术成就未来” 博客,请务必保留此出处http://jishuweiwang.blog.51cto.com/6977090/1427005