location语法学习
location只有两类,正则location,普通location
结论
- 先普通,后正则,与配置顺序无关
- 普通location之间的匹配顺序:按最大前缀匹配,首先要能匹配上,简单来说就是uri中要全包含该location,在全匹配的情况下,谁长选谁。
- 正则location之间的匹配顺序:按配置文件物理顺序匹配,只要匹配到一条,不再考虑后面的匹配结果。
- 普通location与正则location之间的匹配结果选择:
普通location先匹配,匹配到了结果,取最大前缀的那一个,只是一个临时结果;会继续正则location的匹配,如果匹配到正则,则用匹配到的正则结果;
如果没有匹配到正则,则继续用普通匹配的那个结果。
- 如果在普通location中增加了
^~
或者=
前缀,且匹配上了,则不再继续正则匹配。^~
与=
的区别是=
是严格匹配,^~
依然遵循普通匹配的最大前缀原则
常用正则
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的结束
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符,如此处的字符 c
[a-z] : 匹配a-z小写字母的任意一个
(a|b|c):匹配a或b或c
location 反向代理 转发规则
如果
proxy_pass
转发的地址不包含URI,则地址会原封不动的追加到 转发的地址后面,如果有URI,则匹配部分不会被追加上。# 无URI情况 location /api { proxy_pass 192.168.0.2; } # 访问地址 www.a.com/api/v1 # 后端地址 192.168.0.2/api/v1 # 有URI情况 location /api { proxy_pass 192.168.0.3/s1; } # 访问地址 www.a.com/api/v2 # 后端地址 192.168.0.2/s1/v2
- 保持结尾一致,location匹配表达式如果有
/
结尾,则proxy_pass 转发的地址也加上/
, 都没有就都不加。