nginx 之 location 匹配规则

目录

 

1、语法、规则 

2、下面演示一个具体的例子


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!

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值