目录
1、语法、规则
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
- = 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
- ~ 区分大小写匹配(可用正则表达式)
- ~* 不区分大小写匹配(可用正则表达式)
- !~ 区分大小写不匹配
- !~* 不区分大小写不匹配
- ^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
根据请求URI设置配置。
在对以“%XX”形式编码的文本进行解码、解析对相对路径组件 “.
” 和“..
”引用之后,对规范化URI执行匹配。并可能将两个或多个相邻斜杠压缩为一个斜杠。
location 可以由前缀字符串定义,也可以由正则表达式定义。正则表达式由前面的 “~*” 修饰符(用于不区分大小写的匹配)或 “~” 修饰符(用于区分大小写的匹配)指定。要查找与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记忆匹配前缀最长的位置。然后,按照它们在配置文件中出现的顺序检查正则表达式。对正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有与正则表达式匹配,则使用前面记住的前缀位置的配置。
location 块可以嵌套,下面会提到一些例外。
对于大小写不敏感的操作系统(如macOS和Cygwin),与前缀字符串匹配将忽略大小写(0.7.7)。但是,比较仅限于一个字节的地区。
正则表达式可以包含捕获(0.7.40),稍后可以在其他指令中使用。
如果最长匹配的前缀位置有“^~”修饰符,则不检查正则表达式。
另外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到精确匹配,则搜索终止。例如,如果一个“/”请求频繁发生,定义“location = /”将加速这些请求的处理,因为搜索将在第一次比较之后终止。这样的位置显然不能包含嵌套的位置。
从0.7.1到0.8.41的n个版本中,如果请求匹配的前缀位置没有“=”和“^~”修饰符,那么搜索也会终止,正则表达式也不会被检查。
让我们用一个例子来说明上述问题:
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 。
如果位置是由以斜杠字符结尾的前缀字符串定义的,并且请求是由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;
}
2、下面演示一个具体的例子
写一个location.conf 配置
location ~ /test1/$ {
return 200 'first regular expressions match!\n';
}
location ~* /test1/(\w+)$ {
return 200 'longest regular expressions match!\n';
}
location ^~ /test1/ {
return 200 'stop regular expressions match!\n';
}
location /test1/test2 {
return 200 'longest prefix string match!\n';
}
location /test1 {
return 200 'prefix string match!\n';
}
location =/test1 {
return 200 'exact match!\n';
}
使用curl 进行访问:
[root@zk02 ~]# curl localhost/test1
exact match!
[root@zk02 ~]# curl localhost/test1/
stop regular expressions match!
[root@zk02 ~]# curl localhost/test1/test2
longest regular expressions match!
下面这个正则表达式没有匹配上,使用最长字符串进行匹配
[root@zk02 ~]# curl localhost/test1/test2/
longest prefix string match!