写点什么

nginx 路径匹配踩坑

用户头像
hasWhere
关注
发布于: 2 小时前
nginx路径匹配踩坑

location 匹配优先级


等号类型(=)的优先级最高,需要精确匹配。一旦匹配成功,则不再查找其他匹配项。

^~类型表达式。一旦匹配成功,则不再查找其他匹配项。

正则表达式类型(~ ~*)的优先级次之。如果有多个 location 的正则能匹配的话,则使用正则表达式最长的那个。

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)


proxy_pass 路径带 / 的问题

#情况1: proxy_pass 后带 / 
location /abc/ {
proxy_pass http://klvchen.com/;
}
#会被代理成 http://klvchen.com/test.html
#情况2: proxy_pass 后不带 /
location /abc/ {
proxy_pass http://klvchen.com;
}
#会被代理成 http://klvchen.com/abc/test.html
复制代码


常用正则

.: 匹配除换行符以外的任意字符

?: 重复 0 次或 1 次

+: 重复 1 次或更多次

*: 重复 0 次或更多次

\d:匹配数字

^: 匹配字符串的开始

$: 匹配字符串的结束

{n}: 重复 n 次

{n,}: 重复 n 次或更多次

[c]: 匹配单个字符 c

[a-z]: 匹配 a-z 小写字母的任意一个

小括号()之间匹配的内容,可以在后面通过 $1 来引用,$2 表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。


常见配置项

location = / {  # 精确匹配 / ,主机名后面不能带任何字符串  [ configuration A ]}location / {  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求  # 但是正则和最长字符串会优先匹配  [ configuration B ]}location /documents/ {  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条  [ configuration C ]}location ~ /documents/Abc {  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条  [ configuration CC ]}location ^~ /images/ {  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。  [ configuration D ]}location ~* \.(gif|jpg|jpeg)$ {  # 匹配所有以 gif,jpg或jpeg 结尾的请求  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则  [ configuration E ]}location /images/ {  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在  [ configuration F ]}location /images/abc {  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在  # F与G的放置顺序是没有关系的  [ configuration G ]}location ~ /images/abc/ {  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用  [ configuration H ]}
复制代码


参考:

https://www.jb51.net/article/144297.htm

https://blog.csdn.net/qq_39884410/article/details/106247149

发布于: 2 小时前阅读数: 2
用户头像

hasWhere

关注

间歇性努力的学习渣 2018.04.20 加入

通过博客来提高下对自己的要求

评论

发布
暂无评论
nginx路径匹配踩坑