Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
规则
" = "修饰符可以定义URI和location的精确匹配,如果找到完全匹配,则终止搜索。
“~”修饰符(用于区分大小写的匹配)使用正则表达式指定,正则表达式的搜索在第一个匹配处终止。
“~*”修饰符(用于不区分大小写的匹配)使用正则表达式指定,正则表达式的搜索在第一个匹配处终止。
“^”前缀有“^”修饰符,则不检查正则表达式。
“@”前缀定义了一个命名location。这样的location不用于常规的请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套的location。
检查顺序
为了匹配给定请求的location,nginx首先检查使用前缀字符串定义的location(前缀location),选择匹配前缀最长的location并记住。然后按照正则表达式在配置文件中的出现顺序检查,正则表达式的搜索在第一个匹配处终止。如果最长匹配的前缀location有“^~”修饰符,则不检查正则表达式。使用" = "修饰符可以定义URI和location的精确匹配。如果找到完全匹配,则终止搜索。例如,如果频繁出现“/”请求,定义“location = /”将加快这些请求的处理速度,因为搜索在第一次比较后立即终止。
示例
示例1
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。
示例2
如果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;
}
示例3
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ .(mp3|mp4) {
root /www/media;
}
}
示例中,NGINX 在文件系统的 /www/data/images/ 目录中搜索以 /images/ 开头的 URI。 但如果 URI 以 .mp3 或 .mp4 扩展名结尾,NGINX 会在 /www/media/ 目录中搜索该文件,因为它是在匹配的位置块中定义的。
如果请求以斜杠结尾,NGINX 会将其视为对目录的请求,并尝试在该目录中查找索引文件。 index 指令定义索引文件的名称(默认值为index.html)。
继续这个例子,如果请求 URI 是 /images/some/path/,NGINX 会传送文件 /www/data/images/some/path/index.html(如果存在)。 如果没有,NGINX 默认返回 HTTP 代码 404(未找到)。 要将 NGINX 配置为返回自动生成的目录列表,请在 autoindex 指令中包含 on 参数:
location /images/ {
autoindex on;
}
可以在index指令中列出多个文件名。NGINX按照指定的顺序搜索文件,并返回第一个找到的文件。
location / {
index index.$geo.html index.htm index.html;
}
这里使用的$geo变量是一个通过geo指令设置的自定义变量。该变量的值取决于客户端的IP地址。
location / {
root /data;
index index.html index.php;
}
location ~ .php {
fastcgi_pass localhost:8000;
#...
}
在这里,如果请求中的URI是/path/,而/data/path/index.html不存在,但/data/path/index.php存在,则对/path/index.php的内部重定向将映射到第二个位置。因此,请求被代理。