nginx rewrite 规则

生效位置

rewrite 可以写在 server 、 location、 if  配置段内

格式

rewrite   regex   replacement   [flag]

regex是匹配的正则表达式。

只会处理$request_uri部分,不会匹配$host

replacement 是跳转的URI。

可以以http:// 或者https:// 开头, 也可以省掉$host 直接写$request_uri部分。

这部分支持变量。

flag 是控制uri行为的,可写可不写。

有break(中止)、last、redict(302临时重定向)、permanent(301永久重定向)。

用户浏览器访问俩个重定向效果一致。对于搜索引擎和爬虫,301更有利于SEO(搜索引擎优化)

http://和https:// 开头的flag部分建议使用permanent

uri不变,转换域名的用法:

location / {
    rewrite /(.*) http://www.baidu.com/$1 permanent ;
}

( )括起来的部分 在后面用 $n 调用,$1 表示第一个括号内容,$2 表示第二个括号内容。

location / {
    rewrite /.* http://www.baidu.com$request_uri  permanent;
}

这里replacement部分使用了变量

server {
    listen 80;
    server_name www.baidu.coml;
    root /tmp/abc.com;
    index index.html;
    rewrite /(.*) /abc/$1 redirect;
}

这样写,每次把uri改写后又会被server识别一次,导致陷入循环,

比如一开始www.baidu.com/a66 会变成 www.baidu.com/abc/abc/abc/.../abc/abc/a66

nginx 最大的 rewrite 次数是 50 次,最终是会停下来,但是离我们要的结果差太远了。

对于免得陷入循环

解决方法一:

rewrite /(.*) /abc/$1 break;

加上break,改写一次自动停止。

解决办法二:

if ($request_uri !~ '^/abc/')
{
    rewrite /(.*) /abc/$1 redirect;
}

当不匹配 /abc/ 开头的uri的时候才进入rewrite ,这种写法比较明确。

直接curl只能看到301的状态

 curl -I 看标头,有跳转后的地址记录

curl  -L  ——  会进行跳转后继续访问。

因为每次都能进入到 location / 中,可能导致不断循环发生。

这里只是重复访问了50次。

如果有多层目录结构,还会发生循环嵌套。

这里直接flag部分加break的方法可以只控制跳一次,但也不完美。

因为location / 作为入口,如果用户就是要访问  $host/www/test666 时候,会被迫访问到 $host/www/www/test666 ,因为无可奈何都要加一次。如果要控制,这需要用 if 来加以判断,不以www开头的时候,再进行跳转。

如此则只会跳转一次

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值