zoukankan      html  css  js  c++  java
  • nginx location 匹配顺序

    location 匹配的原型是这样的:location [=|~|~*|^~|@] /uri/ { … }

    “=”是精确匹配
    “@”是命名的location ,在正常的location 匹配中不会使用,仅仅在内部跳转中才会使用到。
    “~”是区分大小写的匹配
    “~*”是不区分大小写的匹配
    “^~”表示中止正则匹配(这个平时没太注意)

    在一个请求中,匹配的顺序是这样的。先使用所有location 来匹配URI的开始部分,最精确匹配的(形象点说,就是即配置字符数最多的)为最后匹配结果;然后进行正则表达式的匹配,按照配置文件中的顺序来进行匹配,如果有一个匹配成功,则结束正则匹配,且最后匹配结果为此location ,否则,最后结果为先前最精确匹配的的那个location 。

    之前有提到过”^~”,它配置在非正则匹配中,表示,如果最精确匹配的loction为此location ,则立即返回该location 作为结果,而不进行下一步的正则匹配,这样,就此可以不必要进入到正则匹配当中,以加快匹配速度。

    还有”=”,它是最精确的匹配,而且优先级最高。最先进行带”=”的匹配,如果匹配成功,立马返回。

    最后总结下匹配的过程,有四步:
    1. 带”=”前缀的先进行匹配,如果找到了,中止查找。
    2. 所有其它location 进行非正则的匹配,找到最精确匹配的那个,如果匹配到带”^~”前缀的,则中止查找。
    3. 正则查找,按照我们配置文件中配置的location 顺序进行查找。
    4. 如果正则查找匹配成功,则使用此正则匹配的location ,否则,使用第二步查找的结果。

    这里要特别说明下”=”与”^~”的区别:
    “=”在匹配时,则匹配带”=”的location 。而”^~”,则会匹配所有非”=”的非正则location ,只有在确认它是最精确匹配的location 后,才生效。


  • 相关阅读:
    Keepass无法导入密钥文件
    数据库交互方式之一
    Grey encoder and decoder
    SystemVerilog 序列运算符与属性运算符
    避免int 与 pointer的隐式类型转换
    xxx.lib(xxx.obj)fatal error LNK1103: debugging information corrupt; recompile module 的解决方案
    c++ static 关键字用法
    影响中国软件开发的人(摘录)
    链接
    有助于事业发展和幸福感提升的四个约定
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4429425.html
Copyright © 2011-2022 走看看