最近在研究了nginx,整理了一些小知识,如果熟悉了对建站能提供不少帮助。

uri匹配篇

语法说明

location [=|~|~*|^~|@] /uri/ { … } 语法

以下三个为【普通匹配】类型
location = /uri/ { … } 严格匹配
location /uri/ { … } 最大前缀匹配
location ^~ /uri/ { … } 最大前缀匹配 忽略正则匹配

以下二个为【正则匹配】类型
location ~ /uri/ { … } 区分大小写
location ~* /uri/ { … } 不区分大小写

以下一个为【内部定向】类型
location @ /uri/ { … } 内部定向

匹配规律

规律大致整理如下,但并不是绝对的。特殊情况以下会具体列出来。

通常情况下先【普通匹配】再【正则匹配】


#/uri/log.txt

location /uri/log.txt { configuration A }

location ~ log.txt$ { configuration B }

#结果:configuration B

以下两种情况【普通匹配】后不在继续【正则匹配】了


#/uri/log.txt

location ^~ /uri/log.txt { configuration A }

location ~ log.txt$ { configuration B }

#结果:configuration A


#/uri/log.txt

location = /uri/log.txt { configuration A }

location ~ log.txt$ { configuration B }

#结果:configuration A

【普通匹配】与【普通匹配】按着最大前缀匹配原则 注:与先后顺序无关


#/uri/dir/log.txt

location  /uri/ { configuration A }

location  /uri/dir/ { configuration B }

location  /uri/dir/log.txt { configuration C }

#结果:configuration C

【普通匹配】与【普通匹配】之间严格匹配优先


#/uri/dir/log.txt

location = /uri/dir/log.txt { configuration A }

location  /uri/dir/log.txt { configuration B }

#结果:configuration A

【正则匹配】与【正则匹配】之间按着顺序取先匹配上的


#/uri/dir/log.txt

location ~ txt$ { configuration A }

location ~ log.txt$ { configuration B }

#结果:configuration A

下面我们再看这两个常见的写法就很容易理解了



location / { configuration A }

location  = / { configuration B }


根据上面的定义可以判断出这两个都是【普通匹配】类型的,其中 location / {}这种写法匹配所有的uri请求,如果有更适合的【普通匹配】或者【正则匹配】那么就会被覆盖掉,所以这种写法是优先级最低的,另外一个location = / {}是严格匹配的所以只有访问/根目录的时候才会被匹配,并且不会继续【正则匹配】了

参考资料
官方文档解释


不恋尘世浮华,不写红尘纷扰,不叹世道苍凉,不惹情思哀怨。闲看花开,静待花落,冷暖自知,干净如始。