location

在Nginx的官方文档中定义的location的语法结构为:

location [ = | ~ | ~* | ^~ ] uri 
{ 
    ... 
}
  • uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如 /myserver.php等;也可以是包含有正则表达的字符串,如.php$(表示以.php结尾的URL)等。为了下文叙述方便,我们约定,不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。

  • 方括号里的部分,是可选项,用来改变请求字符串与 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时,可以匹配成功。

Last updated