nginx rewrite规则flag参数 break和 last

今天把nginx站点配置重新复习下, 做下笔记微笑.

首先从网上看到说localtion 指令是 ngx_http_core_module模块提供的指令, 而且是nginx跟后端服务沟通的桥梁(比如php-fpm), 而rewrite 则是 ngx_http_rewrite_module 提供的指令,同样的还有 if. nginx 处理这两个规则的流程是:

  1. 进行rewrite规则匹配,根据命中规则改写localtion.
  2. 如果没有被其他指令中断并退出,则进入localtion匹配.
  3. 执行匹配成功的localtion区块中的指令.
所以rewrite指令应该是对location指令的补充,可以灵活的把各种url映射到对应的localtion, 再由localtion跟后端沟通(localtion的proxy指令).

比如这样一个配置:

server {
        listen  80;
        server_name  www.wx.com;
        root  /Users/zhangchao/www/weixin;
        index index.php;

    # 把abc.html 映射到 index.php
    rewrite /abc.html /index.php;

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ .php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

}
rewrite规则还有第三个flag参数:可以是redirect, permanent, break, last等等.

redirect, permanent 这两个flag是进行重定向(302临时, 301永久), 重定向以后的url也会显示在地址栏, nginx处理这两个是会中断流程, 通过http请求告诉用户端进行重定向, 也就是这次请求不需要进过后端服务,由nginx全职负责.

   # 把abc.html 重定向 success2.html
    rewrite /abc.html /success2.html permanent;
图1
break 和 last :

这两个flag都会中断当前的rewrite流程, 不再继续匹配后续的rewrite指令. 如果是在 server的顶级部分, 两者的作用相同, 跳过剩下的rewrite指令,进入localtion匹配. 如果rewrite是在server区块顶级if内部, 和直接放在server下级的rewrite行为是一致的.

server {
     # 此时两者作用一致
    rewrite /error1.html /error.html break;
    rewrite /error2.html /error.html last;
    
    # 把 /abc.html?name="success2" 映射到success2.html
    if ( $arg_name = "success2" ) {
        rewrite /abc.html /success2.html break;
    }
两者的区别在于当rewrite指令存在于localtion区块时, last跳出localtion块, 重新进行localtion匹配; 而break跳过localtion下的后续rewrite规则, 执行其他指令.

    location /error2.html {
        rewrite /error2.html /error2.html break;		# 跳过后续的rewrite规则, 能正常显示error2.html
    }

    location /success2.html {
        rewrite /success2.html /success2.html last;	# 重新进行localtion匹配, 无限循环, 服务器会出错 500
    }
图2
图3

所有一般情况下, 使用break指令会相对安全, 不会造成循环重定向.

看的博客地址 这里


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值