美文网首页程序员从入门到放弃Java技术升华技术干货
nginx中的location路径匹配规则和优先级

nginx中的location路径匹配规则和优先级

作者: 虾游于海 | 来源:发表于2018-06-16 14:24 被阅读46次

    nginx中location配置项是最基础的配置,而且它的配置也稍显复杂。
    我查找了一些网上的中文博客,很多同学都没有正确的表述出配置的关键点,于是回头用我自己过了2级的英语仔细的阅读了一下nginx的官方文档。将自己的理解记录下来。

    location的匹配语法如下

    location [ = | ~ | ~* | ^~ ] uri { ... }
    

    它包含了路径的匹配规则和针对该规则的配置。
    规则按照前导符主要分五类

    前导符 说明
    = uri {...} 全字匹配,只有当请求路径和uri完全匹配时,对应的规则才会生效
    ~ regular {...} 区分大小写的正则匹配
    ~* regular {...} 不区分大小写的正则匹配
    ^~ uri {...} 否定正则的路径匹配
    url {...} 没有任何前导符的路径匹配

    这五类规则,同时存在配置文件中时,按照一定的优先级规则生效。
    nginx规则决定流程如下图


    image.png

    文字说明:
    以下说明非常关键
    一、检查请求uri是否与某个=规则匹配,如果有,直接应用规则,终止后续匹配。
    二、nginx首先检查所有路径匹配规则配置项,包括"^~"规则和没有前导符号的规则,选择并记住和当前请求uri匹配度最长的配置项。但这个时候,并不会启用相关的配置,而仅仅是记住。
    三、判断上一步中选择下来的路径规则是否包含 ^~ ,如果包含,则使用该条规则,终止后续匹配。
    四、按配置顺序进行正则表达式检查,匹配到第一条合适的正则表达式时,使用该条规则,终止后续匹配。
    五、使用步骤三选择出来的路径匹配规则。

    来一段官方的原文示例

    location = / {
        [ configuration A ]
    }
    
    location / {
        [ configuration B ]
    }
    
    location /documents/ {
        [ configuration C ]
    }
    
    location ^~ /images/ {
        [ configuration D ]
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
        [ configuration E ]
    }
    

    The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.

    在来一段自己的踩坑示例

    location /abc {
      [ configuration A ]
    }
    location ^~ /abc {
        [ configuration B ]
    }
    location ~* \/abc\/\.(html)$ {
        [ configuration C ]
    }
    

    给定请求/abc/index.html
    此时应该是configuration B生效
    删除B则C生效
    删除C,则是A生效。

    谨以此献给踩过坑的人

    相关文章

      网友评论

        本文标题:nginx中的location路径匹配规则和优先级

        本文链接:https://www.haomeiwen.com/subject/dwieeftx.html