首页 > 代码库 > 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