location 指令

语 法: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;
}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号