location的语法结构为:
1 | location [ = | ~ | ~* | ^~ ] uri {...} |
其中,uri变量是待匹配的请求字符串,可以是不含正则表达式的字符串,如 /myserver.php等;也可以是包含有正则表达式的字符串,如 .php$ (表示以.php结尾的URL)等。为了下文叙述方便,我们约定,不含正则表达式的uri称谓『标准 uri』,使用正则表达式的uri成为『正则 uri』。
其中方括号里的部分,是可选项,用来改变请求字符串与uri的匹配方式。在介绍四中标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。
在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当地一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理次请求。
了解了上面的内容,皆可以解释可选项中各个标识的含义了:
“ = “,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理次请求。
“ ~ “, 用于标识uri包含正则表达式,并且区分大小写。
“ ~* “, 用于标识包含正则表达式,并且不区分大小写。
注意:如果uri包含正则表达式,就必须要使用『 ~ 』或者『 ~* 』标识
“^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即是用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:我们知道,在浏览器传送URI时对一部分字符进行URL编码,比如空格被编码为『%20』,问号被编码为『%3f』等。『^』有一个特点是,它对uri中的这些符号将会进行编码处理。比如,如果location块收到的URI为”/html/%20/data”,则当Nginx服务器搜索到匹配为『^/html//data』的location时,可以匹配成功。