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

nginx指令之rewrite,布布扣,bubuko.com

时间: 2024-10-13 22:47:27

nginx指令之rewrite的相关文章

实例讲解Nginx下的rewrite规则 来源:Linux社区

一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* -d和!-d用来判断是否存在目录* -e和!-e用来判断是否存在文件或目录* -x和!-x用来判断文件是否可执行三.rewrite指令的最后一项参数为flag标记,flag标记有:1.last    相当于apache里面的[L]标记,表示rewrite.2.break本条规则匹配完成后,终止匹配

Nginx配置的rewrite编写时last与break的区别详解

rewite 1. server块中的rewrite: 在server块下,会优先执行rewrite部分,然后才会去匹配location块 server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空. 2. location中的rewirte: 不写last和break -    那么流程就是依次执行这些rewrite 1. rewrite break -        url重写后,直接使用当前资源,不再执行loca

Nginx Location和Rewrite深入剖析

Nginx Location和Rewrite深入剖析 Nginx Location Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作. location功能是由ngx_http_index_module模块提供的. location常放在serve

Nginx 之四: Nginx服务器的rewrite、全局变量、重定向和防盗链相关功能

一:Nginx 后端服务器组的配置: 1.upstream: 用于设置后端服务器组的主要指令,upstream类似于之前的server块或http块,用法如下: upstreame Myserver{ #ip_hash; #least_conn: #fair; #hash $request_uri; #hash_method crc32; server 192.168.0.2:8080 #weight 2 max_fails 3 fail_timeout 60; 192.168.0.3:8080

Nginx中的Rewrite的重定向配置与实践

阅读目录 一:理解地址重写 与 地址转发的含义. 二:理解 Rewrite指令 使用 三:理解if指令 四:理解防盗链及nginx配置 简介:Rewrite是Nginx服务器提供的一个重要的功能,它可以实现URL重定向功能. 回到顶部 一:理解地址重写 与 地址转发的含义. 地址重写与地址转发是两个不同的概念. 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上

thinkphp nginx php-fpm url rewrite 导致 404 错误

thinkphp nginx php-fpm url rewrite 导致 404 错误 之前thinkphp的系统部署在apache上,考虑到在并发性能nginx比apache强悍得多,所以在centos上以 nginx+php-fpm模式重新部署了thinkphp系统,结果发现诸如 1 /index.php/home/user/verify 此类的url nginx会报404错误,但是改成 1 /index.php?s=/home/user/verify 之后却能够访问,这说明前一种url

nginx访问控制、rewrite应用、代理设置

 nginx访问控制.rewrite应用.代理设置 一.访问控制 在这里依然还是以default2.conf虚拟主机为例,配置文件位置default2.conf 1.允许某个ip访问 ,需要在default2.conf配置配文件中添加,具体如下图: 规则如下: allow 127.0.0.1; allow 192.168.21.97; deny all; 只允许127.0.0.1和192.168.21.97来访问,其他的全部拒绝 退出保存 1)检查配置文件 2)重置配置文件 3)测试 允许ip测

nginx访问控制、rewrite应用

nginx访问控制.rewrite应用 一.访问控制 在这里依然还是以default2.conf虚拟主机为例,配置文件位置default2.conf 1.允许某个ip访问 ,需要在default2.conf配置配文件中添加,具体如下图: 规则如下: allow 127.0.0.1; allow 192.168.21.97; deny all; 只允许127.0.0.1和192.168.21.97来访问,其他的全部拒绝 退出保存 1)检查配置文件 2)重置配置文件 3)测试 允许ip测试 [[em

nginx重写规则报nginx: [emerg] directive "rewrite" is not terminated by ";"

对于下面的重写规则 rewrite ^/gongying/([\d]{8})_([\d]+).html$ /index.php?app=support&act=view&pts=$1&support_id=$2 last; 始终报: nginx: [emerg] directive "rewrite" is not terminated by ";"  测到最后发现原来是{}惹的祸,用引号引起来就没问题了