NGINX学习笔记(location)
location语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
语法规则很简单,一个location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作
修饰符:
= 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。 ~ 表示该规则是使用正则定义的,区分大小写。 ~* 表示该规则是使用正则定义的,不区分大小写。 ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。
匹配过程:
对请求的url序列化。例如,对%xx
等字符进行解码,去除url中多个相连的/
,解析url中的.
,..
等。这一步是匹配的前置工作。
location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有~
或~*
修饰符。
具体的匹配过程如下:
首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。
如果找到了精确匹配的location,也就是使用了=
修饰符的location,结束查找,使用它的配置。
然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。
如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。
基于以上的匹配过程,我们可以得到以下两点启示:
使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。
使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义location。
宝剑锋从磨砺出 梅花香自苦寒来