注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

nginx中关键重写向(url重写)命令:rewrite的功能理解  

2014-09-20 00:47:35|  分类: nginx编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

rewrite

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

  • last - 完成重写指令,之后搜索相应的URI或location并向新地址取回内容回复给客户端请求方,发挥代“购”功能。
  • break - 完成重写指令,停止工作。

        说明:以上两种重定向不会让浏览器改变url(相当于服务器加回复说,原来页面不再了,搬家了却新的地方,你去新地方找吧)不重新向新的地点发出请求,不产生新的握手。当然这些工作由nginx代劳(转换/代理)完成,客户端失去了知情权。

  • redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
  • permanent - 返回301永久重定向。

       说明:后面重写,重定向则是通过通知(本身起到了资询指路牌的功能)浏览器重新发起请求(知道了新的地址)。客户端是能看出url的变化的。作用:帮助实现旁路联接。

       重要特点:以指路牌的身份指示浏览器抛弃前发起的请求链接方向,而发起新的请求链接。


      注意如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“Host”头或者 server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名(来补全访问字符串url),如果你总是想让nginx 使用“Host”头,可以在server_name使用“*”通配符(http核心模块中的server_name)。例如:

rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last; #last--向后持续检索的意思。
rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   last;
return   403;

说明:在“rewrite uri1 uri2 last”的结构中,last为了完成向后的继续自行取材工作,会进行最大10次(通讯出错的情况下)的多次验证,因此可能导致进程的延时。

      但是如果我们将其放入一个名为/download/的location匹配中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。

location /download/ 
{ rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }

        如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:

rewrite  ^/users/(.*)$  /show?user=$1?  last;

          注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的URL:

              /photos/123456 

为:

              /path/to/photos/12/1234/123456.png 

则使用以下正则表达式(注意引号):

           rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

            如果指定一个“?”在重写的结尾,Nginx将丢弃请求中的参数,即变量$args,当使用$request_uri$uri&$args时可以在rewrite结尾使用“?”以避免nginx处理两次参数串。
在rewrite中使用$request_uri将www.example.com重写到example.com:

server
 { server_name www.example.com; rewrite ^ http://example.com$request_uri? permanent; }

     同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:

if ($args ^~ post=100)    #^~表示直接字符匹配
{ rewrite ^ http://example.com/new-address.html? permanent; }

     注意$args变量不会被编译,与location过程中的URI不同(更多内容参考http核心模块中的location)。

  评论这张
 
阅读(76)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017