在Nginx官方文档中定义的location的语法结构为
location [=|~|~*|^~] uri {...}
其中uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如 /api/server.php ---标准uri
也可以是包含正则表达式的字符串, 如 \.php$ (表示以.php结尾的URL) --- 正则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时可以匹配成功。