侧边栏壁纸
  • 累计撰写 84 篇文章
  • 累计创建 35 个标签
  • 累计收到 1 条评论

目 录CONTENT

nginx location匹配规则

天明
2023-10-27 / 0 评论 / 0 点赞 / 25 阅读 / 1927 字 / 正在检测是否收录...

匹配模式及顺序

  • = 精确匹配;用于标准 uri 前,要求请求字符串和 uri 严格匹配。如果匹配成功,就停止匹配,立即执行该 location 里面的请求。
  • ~ 正则匹配;用于正则 uri 前,表示 uri 里面包含正则,并且区分大小写。
  • ~* 正则匹配;用于正则 uri 前,表示 uri 里面包含正则,不区分大小写。
  • ^~ 非正则匹配;用于标准 uri 前,nginx 服务器匹配到前缀最多的 uri 后就结束,该模式匹配成功后,不会使用正则匹配。
  • 无 普通匹配(最长字符匹配);与 location 顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。
    说明:
  1. 如果 uri 里面包含正则表达式,就必须使用*标识符;
  2. 针对匹配标识符,可以在前面加上!来取反,如下:
    2.1 !~ 表示正则不匹配,区分大小写。
    2.2 !~
    表示正则不匹配,不区分大小写。
  3. 匹配顺序如下:
    3.1 (location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)即
    (精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)

示例

# = 精确匹配/ ,主机名后面不能带任何字符串
location = / {
    echo "规则A";
}
# = 精确匹配 /login 开头的地址,匹配符合以后,不在继续往下搜索
location = /login {
    echo "规则B";
}
# ^~ 非正则匹配,匹配/blog/后,停止往下搜索正则,采用这一条
location ^~ /blog/ {
  echo "规则C";
}
# ~ 区分大小写的正则匹配,若匹配成功,停止往下搜索正则,采用这一条
location ~  \.(gif|jpg|png|js|css)$ {
    echo "规则D";
}
# ~* 不区分大小写的正则匹配,停止往下搜索正则,采用这一条
location ~* \.png$ {
    echo "规则E";
}
# 前缀匹配,最长字符串匹配,若完全匹配成功,就不在继续匹配,否则还会进行正则匹配
location /blog/detail {
  echo "规则G";
}
# 默认规则,相当于switch中的default,如果没任何规则匹配上,就采用这条规则
location / {
    echo "规则F";
}

其它

根据 IP 转发

# 如果有多个IP(152|153|155)
if ($remote_addr ~ "202.160.46.150|151")  {
    proxy_pass http://172.16.10.1:8000;
    break;
}

proxy_pass 指令’/’注意事项

location /test/ {
    proxy_pass http://t6:8300;
}
location /test/ {
    proxy_pass http://t6:8300/;
}

针对情况 1,如果访问 url = http://server/test/test.jsp,则被nginx代理后,请求路径会便问http://proxy_pass/test/test.jsp,将test/ 作为根路径,请求 test/路径下的资源
针对情况 2,如果访问 url = http://server/test/test.jsp,则被nginx代理后,请求路径会变为 http://proxy_pass/test.jsp,直接访问server的根资源
0

评论区