nginx之location匹配优先级和安全问题详解程序员

最近一直在做location的配置,遇到优先级别问题(如有配置不当,会存在安全隐患),以下是个人的一些学习体会

一、location 匹配符

1.等于匹配符:      ##“=

其特点可概括为两点:   ##1.精确匹配,2.不支持正则表达式

语法示例:

1     location = /static/img/file.jpg { 
2  
3     ... 
4  
5     }

Code-1

2.空  匹配符: 空匹配符的特点是:   ##1.匹配以指定模式开始的URI,2.不支持正则

语法示例:

1     location /static/img/ { 
2  
3     ... 
4  
5     }

Code-2

3.正则匹配符: “~”     ##区分大小写的正则匹配

语法示例:

1     location ~ /static/img/.*/.jpg$ { 
2  
3     ... 
4  
5     }

Code-4

4.~*  表示:    ##不区分大小写的正则匹配,但是一些对大小写不敏感的系统,这两者没区别。

语法示例:

1     location ~* /static/img/.*/.jpg$ { 
2  
3     ... 
4  
5     }

Code-5

5.^~  表示:    ##优先前缀匹配

1 location ^~/static/img/ { 
2  
3 ... 
4  
5 }

Code-6

6.内部访问符 @  表示:    ##一般用于错误页面

二、匹配优先级

1.=

2.空匹配符,满足精准匹配时

3.^~

4.~或~*

对于请求http://luck.com/static/img/test.jpg

1.如命中精确匹配,例如:

1     location = /static/img/logo.jpg { 
2  
3     }

Code-7

则优先精确匹配,并终止匹配。

2.如果命中多个 空 匹配,例如:

1     location /static/ { 
2  
3     } 
4  
5     location /static/img/ { 
6  
7     }

Code-8

则记住最长的前缀匹配,即上例中的/static/img/,并继续匹配。

3.如果最长的前缀匹配是优先前缀匹配,例如:

1     location /static/ { 
2  
3     } 
4  
5     location ^~ /static/img/ { 
6  
7     }

Code-9

则命中次最长的优先最长匹配,并终止匹配

4.如果命中多个正则匹配,例如:

 1     location /static/ { 
 2  
 3     } 
 4  
 5     location /static/img/ { 
 6  
 7     } 
 8  
 9     location ~* /static/ { 
10  
11     } 
12  
13     location ~* /static/img/ { 
14  
15     }

Code-10

则忘记上述 2 中的最长前缀匹配,使用第一个命中的正则匹配,即上例中的 location ~* /static/ ,并终止匹配(命中多个正则匹配,优先使用配置文件中出现次序的第一个

三、实战经验总结
1.location 匹配的优先级(来自实践总结)
(location =) -> (location 完整路径) ->(location ^~ 路径) ->(location ~* 正则) ->(location 路径)
只要匹配到,其它的都会忽略,然后返回到改匹配。

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/6429.html

(0)
上一篇 2021年7月16日 23:24
下一篇 2021年7月16日 23:24

相关推荐

发表回复

登录后才能评论