语 法:location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
默认值:—
上下文:server, location
根据请求 URI 设置配置。
在解码以 “%XX” 形式编码的文本后,对一个规范化的 URI 执行匹配,解析对相对路径组件 “.” 和 “..” 的引用,并可能将两个或多个相邻斜杠压缩成一个斜杠。
location 可以由前缀字符串定义,也可以由正则表达式定义。正则表达式使用前面的 “~*” 修饰符(用于不区分大小写的匹配)或 “~” 修饰符(用于区分大小写的匹配)指定。为了找到与给定请求匹配的 location,nginx 首先检查使用前缀字符串定义的 location(前缀位置)。其中,选择匹配前缀最长的 location 并进行暂时存储。然后按正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的内容,则使用前面暂时存储的前缀 location 的配置。
location 配置块可以嵌套,下面是一些例外情况:
对于不区分大小写的操作系统,例如 macOS 和 Cygwin,匹配前缀字符串会忽略大小写 (0.7.7)。但是,比较仅限于单字节语言环境。
正则表达式可以包含稍后可以在其他指令中使用的捕获 (0.7.40)。
如果最长匹配前缀 location 具有 “^~” 修饰符,则不检查正则表达式。
此外,使用“=”修饰符可以定义 URI 和 location 的精确匹配。如果找到完全匹配,则搜索终止。例如,如果“/”请求频繁发生,定义“location = /”将加速这些请求的处理,因为搜索在第一次比较后立即终止。这样的 location 显然不能包含嵌套 location。
在 0.7.1 到 0.8.41 的版本中,如果请求匹配没有“=”和“^~”修饰符的前缀位置,搜索也会终止并且不检查正则表达式。
让我们通过一个例子来说明上面的内容:
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。
“@”前缀定义了一个命名 location,这样的 location 不用于常规请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套 location。
如果 location 由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 之一处理,则执行特殊处理。对于 URI 等于这个字符串但尾部没有斜杠的请求,将返回一个带有代码301的永久重定向到附加斜杠的请求URI。如果不希望这样,URI 和 location 的精确匹配可以这样定义:
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }