每个server块中可以包含多个location块,在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来

    location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能都是在这部分实现,许多第三方模块的配置也是在location块中提供功能

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

    其中,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前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
    • “~”,用于表示uri包含正则表达式,并且区分大小写
    • “~*”,用于表示uri包含正则表达式,并且不区分大小写,注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识