Nginx(9)URI重写 - rewrite

Rewrite 是Nginx提供的一个重要基本功能,其在Web服务器产品中几乎是必备的功能,用于实现URL的重写。
URL的重写是非常有用的功能,比如它可以让我们在改变网站结构后,无需要求客户端用户修改原有的浏览器书签。也无需其他网站修改对我们网站的友情链接。
Nginx的Rewrite 功能的实现依赖于PCRE库的支持

rewrite可以在server和location块中单独存在或同时存在。同时存在时先执行server块中然后再执行location块中的(无论修饰符是last或break)

rewrite 接受到的URL不包含HOST地址和参数,因此regex不可能匹配到URI的HOST地址或参数。只匹配文件部分。

语法: rewrite regex replacement [flag];

regex - 用于匹配URI的正则表达式。使用"()"标记要截取的内容。

replacement - 匹配成功后用于替换URI 中被截取内容的字符串
默认情况下,如果该字符串是由"http://" 或"https://" 开头的, 则不会继续对URI 进行处理,而是直接将重写后的URI返回给客户端。
如果replacement字符串包括新的请求参数,以往的请求参数会添加到新参数后面。
如果不希望这样,在replacement字符串末尾加一个问号“?”,就可以避免,比如: rewrite ^/users/(.*)$ /show?user=$1? last;

flag - 有break、last、permanent、redirect
last - 停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location;
break - 停止执行当前这一轮的ngx_http_rewrite_module指令集;
redirect - 返回状态码为302的临时重定向;
permanent - 返回状态码为301的永久重定向。

rewrite还可以放在if中,if在server块里。

语法: if (condition) { ... }

如果condition为真,执行定义在大括号中的rewrite模块指令。if指令会从上一层配置中继承配置。
condition可以是下列任意一种:
• 变量名: 如果变量值为空或者是0,则条件为假(在1.0.1版本以前,任何以0开头的值都为假);
• 使用“=”和“!=”运算符比较变量和字符串;
• 使用“~”(大小写敏感)和“~*”(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中。
• 使用“-f”和“!-f”运算符检查文件是否存在;
• 使用“-d”和“!-d”运算符检查目录是否存在;
• 使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在;
• 使用“-x”和“!-x”运算符检查可执行文件;

举例:
if ($http_user_agent ~ MSIE) { # 一般正则不用加引号
rewrite ^(.*)$ /msie/$1 last;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") { # 当正则中包含}或;时,必须使用引号将整个正则引起来
set $id $1;
}

if ($request_method = POST) {
return 405;
}

if ($slow) {
limit_rate 10k;
}

if ($invalid_referer) {
return 403;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值