zoukankan      html  css  js  c++  java
  • nginx中的break与last指令区别



    很多人资料说,last与break的区别在于,last并不会停止对下面location的匹配。我理解上模模糊糊。今天自己来测验了一下。




    rewrite 指令末尾的break应该与单独写break作用是不同的,比如:


    if ($slow) {
      limit_rate  10k;
      break;
    }



    nginx对待rewrite中的break使用了单独的代码处理去此命令。




    测验一下break与last的区别




    location /test1.txt/ {

    rewrite /test1.txt/  /test2.txt break;

    }

    location ~ test2.txt {
    return 508;
    }


    使用break会停止匹配下面的location,直接发起请求www.xxx.com/test2.txt,由于不存在文件test2.txt,则会直接显示404。


    使用last的话,会继续搜索下面是否有符合条件(符合重写后的/test2.txt请求)的location。此时,/test2.txt刚好与面location的条件对应上了,进入花括号{}里面的代码执行,这里会返回508。

    last,重写后的规则,会继续用重写后的值去匹配下面的location。

    break,重写后的规则,不会去匹配下面的location。使用新的规则,直接发起一次http请求了。

    一个直接进行一次http请求,一个继续往下面匹配loction



    在nginx的源码中处理break与last完全分成了不同的代码块来处理:

    if (ngx_strcmp(value[3].data, "last") == 0) {‘
    last = 1;

    ....................


    } else if (ngx_strcmp(value[3].data, "break") == 0) {
    regex->break_cycle = 1;
    last = 1;
    ....................
    }

    从上面看到是对数组的第三个元素专门进行处理。


    重写代码"rewrite /2a.txt/ /2b.txt break;"中的break指令刚好是在第四(0开始数刚好是用3访问)个位置处。


    理解不准之处。欢迎指正。nginx是用c语言编写的。熟悉c语言就容易看懂源码。我使用c语言少。以后要去补习一下。

  • 相关阅读:
    DevExpress的GridControl的实时加载数据解决方案(取代分页)
    WinForm程序虚拟分页(实时加载数据)
    C#使用反射特性构建访问者模式
    WinApi学习笔记内存的复制,填充,输出等操作
    PL/SQL学习笔记程序包
    WinApi学习笔记创建进程
    PL/SQL学习笔记触发器
    WinApi学习笔记获取光驱中的信息
    WinApi学习笔记读写文件
    不通过配置文件启动WCF服务
  • 原文地址:https://www.cnblogs.com/wangtao_20/p/3350074.html
Copyright © 2011-2022 走看看