首页 > 代码库 > nginx之location匹配优先级和安全问题
nginx之location匹配优先级和安全问题
最近一直在做location的配置,遇到优先级别问题(如有配置不当,会存在安全隐患),以下是个人的一些学习体会
一、location 匹配符
1.等于匹配符: ##“=”
其特点可概括为两点: ##1.精确匹配,2.不支持正则表达式
语法示例:
1 location = /static/img/file.jpg { 2 3 ... 4 5 }
2.空 匹配符: 空匹配符的特点是: ##1.匹配以指定模式开始的URI,2.不支持正则
语法示例:
1 location /static/img/ { 2 3 ... 4 5 }
3.正则匹配符: “~” ##区分大小写的正则匹配
语法示例:
1 location ~ /static/img/.*\.jpg$ { 2 3 ... 4 5 }
4.~* 表示: ##不区分大小写的正则匹配,但是一些对大小写不敏感的系统,这两者没区别。
语法示例:
1 location ~* /static/img/.*\.jpg$ { 2 3 ... 4 5 }
5.^~ 表示: ##优先前缀匹配
1 location ^~/static/img/ { 2 3 ... 4 5 }
6.内部访问符 @ 表示: ##一般用于错误页面
二、匹配优先级
1.=
2.空匹配符,满足精准匹配时
3.^~
4.~或~*
对于请求http://luck.com/static/img/test.jpg
1.如命中精确匹配,例如:
1 location = /static/img/logo.jpg { 2 3 }
则优先精确匹配,并终止匹配。
2.如果命中多个 空 匹配,例如:
1 location /static/ { 2 3 } 4 5 location /static/img/ { 6 7 }
则记住最长的前缀匹配,即上例中的/static/img/,并继续匹配。
3.如果最长的前缀匹配是优先前缀匹配,例如:
1 location /static/ { 2 3 } 4 5 location ^~ /static/img/ { 6 7 }
则命中次最长的优先最长匹配,并终止匹配
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 }
则忘记上述 2 中的最长前缀匹配,使用第一个命中的正则匹配,即上例中的 location ~* /static/ ,并终止匹配(命中多个正则匹配,优先使用配置文件中出现次序的第一个)
三、实战经验总结
1.location 匹配的优先级(来自实践总结)
(location =) -> (location 完整路径) ->(location ^~ 路径) ->(location ~* 正则) ->(location 路径)
只要匹配到,其它的都会忽略,然后返回到改匹配。
nginx之location匹配优先级和安全问题