Nginx的配置文件中的Location用于匹配特定的URI,如果location后面的规则匹配了URI,并且匹配在此处停止向后匹配,则应用该location下面的规则,反之继续进行匹配,直到匹配到相应的规则或匹配到默认的规则。
这篇文章单就location的定位进行讨论,其它的部分不进行解析。
本文解决的问题:
location为什么重要
location = 选择,选中。当我们处理某件事情,往往必须选中,然后再进行进一步的动作。比如处理word时,对某段文字应用字体,肯定是先选中,然后再应用规则。location就是这个意思,选择的对象就是URI,根据不同的URI,使用不同的规则,location就是第一步,只有这一步正确,其余的部分才能保证顺利进行。
location该如何配置
-
location的几种匹配方式
普通匹配:
location = URI { configuration } #精确匹配
location ^~ URI { configuration } #非正则匹配
location [space] URI { configuration} # # 前缀匹配
正则匹配
location ~ URI { configuration } #大小写敏感匹配
location ~* URI { configuration } #大小写不敏感匹配
-
几种匹配方式的优先级
整体规则按照先普通匹配,然后再正则匹配,如果正则不匹配,则回退至上一个普通匹配。其中普通匹配没有顺序之分,正则匹配按照规则的书写顺序进行。
= 精确匹配,匹配后无需后续匹配,直接执行该匹配后的configuration.
[] 前缀匹配,匹配后,继续更长匹配和正则匹配。
^~ 非正则匹配,匹配该规则后,停止继续匹配。
~ 区分大小写的正则匹配,按顺序匹配,第一个匹配即停止。
~* 不区分大小写的匹配,第一个匹配即停止。
-
几种匹配规则的相同点和不同点
对几种匹配进行编号:
= 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