匹配模式及顺序
- = 精确匹配;用于标准 uri 前,要求请求字符串和 uri 严格匹配。如果匹配成功,就停止匹配,立即执行该 location 里面的请求。
- ~ 正则匹配;用于正则 uri 前,表示 uri 里面包含正则,并且区分大小写。
- ~* 正则匹配;用于正则 uri 前,表示 uri 里面包含正则,不区分大小写。
- ^~ 非正则匹配;用于标准 uri 前,nginx 服务器匹配到前缀最多的 uri 后就结束,该模式匹配成功后,不会使用正则匹配。
- 无 普通匹配(最长字符匹配);与 location 顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。
说明:
- 如果 uri 里面包含正则表达式,就必须使用
或*标识符; - 针对
和匹配标识符,可以在前面加上!来取反,如下:
2.1 !~ 表示正则不匹配,区分大小写。
2.2 !~ 表示正则不匹配,不区分大小写。 - 匹配顺序如下:
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的根资源
评论区