nginx rewrite规则flag参数 break和 last

来源:互联网 发布:域名被注册局保留 编辑:程序博客网 时间:2024/04/28 14:13

今天把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 0