转载

谈Nginx的Location匹配

Nginx的配置文件中的Location用于匹配特定的URI,如果location后面的规则匹配了URI,并且匹配在此处停止向后匹配,则应用该location下面的规则,反之继续进行匹配,直到匹配到相应的规则或匹配到默认的规则。

这篇文章单就location的定位进行讨论,其它的部分不进行解析。

本文解决的问题:
location为什么重要
location = 选择,选中。当我们处理某件事情,往往必须选中,然后再进行进一步的动作。比如处理word时,对某段文字应用字体,肯定是先选中,然后再应用规则。location就是这个意思,选择的对象就是URI,根据不同的URI,使用不同的规则,location就是第一步,只有这一步正确,其余的部分才能保证顺利进行。


location该如何配置

  1. location的几种匹配方式

        普通匹配:
        location = URI { configuration } #精确匹配
        location ^~ URI { configuration } #非正则匹配
        location [space] URI { configuration} # # 前缀匹配
       

        正则匹配
        location ~ URI { configuration } #大小写敏感匹配
        location ~* URI { configuration } #大小写不敏感匹配

 
  1. 几种匹配方式的优先级
        整体规则按照先普通匹配,然后再正则匹配,如果正则不匹配,则回退至上一个普通匹配。其中普通匹配没有顺序之分,正则匹配按照规则的书写顺序进行。
        
        = 精确匹配,匹配后无需后续匹配,直接执行该匹配后的configuration.
         [] 前缀匹配,匹配后,继续更长匹配和正则匹配。
        ^~ 非正则匹配,匹配该规则后,停止继续匹配。
        ~ 区分大小写的正则匹配,按顺序匹配,第一个匹配即停止。
        ~* 不区分大小写的匹配,第一个匹配即停止。

  1. 几种匹配规则的相同点和不同点

        对几种匹配进行编号:
        = 1
        空格 2
        ^~ 3
        ~ 4
        ~* 5
        
        1 和 2 的相同点在于,2的特殊情况(隐式精确匹配)会等于1 
         不同点: 1匹配后停止继续的正则匹配,2 匹配后还要进行最大前缀匹配。

        1和3 的相同点在于,都能阻止后续的正则匹配,不同点是 3 匹配后还要继续进行最大前缀匹配。

        1 和 4 5 是不同的匹配方式,匹配了1 就意味着,45都忽略。

        2 和 3 的相同点在于,匹配后都执行最大前缀匹配,但是 2 进行最大前缀匹配后还要进行正则匹配,3 匹配后停止正则匹配。

        

        相同点,在URI一样的情况下会先匹配哪个?
        如果URI相同,则location [] /test 和 location ^~ /test  相同,且配置不能并存。所以,

奇怪的示例:

        location  /test {
                root /data/nginx/test1;
                index index.html;
        }
        location  ^~ /test {
            root test2;
            index  index.html;
        }

nginx: [emerg] duplicate location "/test" in /data/nginx/conf/nginx.conf:20

    

正文到此结束
Loading...