官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

根据请求uri来设置配置

进行匹配的目标是规范化的URI,规范化的URI是指在解码“%XX” 形式编码的文本、解析相对路径符号 “.” 和 “..”,以及将重复斜杠压缩为单斜杠之后的URI。

一个location可以由带前缀的字符串或者正则表达式来定义。正则表达式使用前置的“~*”修饰符 (不区分大小写匹配),或者 “~” 修饰符(区分大小写匹配)来指定。为了找到与指定request匹配的location,Nginx首先使用前缀字符串定义的location进行匹配。其中,选择并记住匹配前缀最长的位置。 然后按正则表达式在配置文件中出现的顺序检查它们。 正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用前面提到的前缀位置的配置。

除了下面提到的一些例外,位置块可以嵌套。

对于不区分大小写的操作系统,例如macOS和Cygwin,与前缀字符串匹配会忽略大小写(0.7.7)。但是,比较仅限于一个字节区域设置。

正则表达式可以包含捕获(0.7.40),稍后可以在其他指令中使用。

正则表达式可以包含捕获(0.7.40),稍后可以在其他指令中使用。

如果最长前缀字符串匹配的location具有“^ ~”修饰符,那么正则表达式不检查。

此外,使用“ =”修饰符可以定义URI和位置的精确匹配。如果找到完全匹配,则搜索终止。例如,如果/频繁发生“ ”请求,则定义“ location = /”将加速这些请求的处理,因为搜索在第一次比较之后立即终止。这样的位置显然不能包含嵌套位置。

让我们用一个例子来说明以上内容:

location = / {
    configuration A
}

location / {
    configuration B
}

location /documents/ {
    configuration C
}

location ^~ /images/ {
    configuration D
}

location ~* \.(gif|jpg|jpeg)$ {
    configuration E
}

“ /”请求将匹配配置A,“ /index.html”请求将匹配配置B,“ /documents/document.html”请求将匹配配置C,“ /images/1.gif”请求将匹配配置D,“ /documents/1.jpg”请求将匹配配置E。

 @”前缀定义命名位置。这样的位置不用于常规请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套位置。

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass, fastcgi_pass, uwsgi_pass,scgi_pass, memcached_pass或 grpc_pass之一处理,则执行特殊处理。为了响应URI等于此字符串但没有尾部斜杠的请求,带有代码301的永久重定向将返回到请求的URI,并附加斜杠。如果不需要,可以像下面这样定义URI和位置的完全匹配:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

(非官方补充:如果/user配置与/user/相同,就不用专门定义= /user)

12-23 20:23