nginx的location, root, alias, proxy_pass

一直对nginx的location匹配顺序处于一种似懂非懂的状态,这次仔细阅读了官方文档后顿悟了,做此纪录。

location

参考:location
location的匹配模式有五种:

location /abc{ #普通前缀匹配
	...
}
location ^~ /abc{ #不做正则的普通前缀匹配
	...
}
location = /abc{ #精准匹配
	...
}
location ~ /abc{ #大小写敏感的正则匹配
	...
}
location ~* /abc{ #大小写不敏感的正则匹配
	...
}

具体的匹配顺序:

  1. 从上往下挨个匹配,满足location = /xxx则结束匹配
  2. 尝试普通前缀匹配,记录匹配度最高的location,如果是^~模式的结束匹配,不是则不会结束匹配,继续第三步
  3. 再次从上往下尝试正则匹配,选择第一个匹配成功的location,没有找到匹配的正则location,选择第二步记录的location

正则匹配的注意项

location ~ /abc{ 
	...
}

这样一个正则匹配并不等同于location /abc这样的前缀匹配,它其实是一个contain的效果,只要目标url中包含"/abc"这样的部分就会被该location匹配上。
例如:/test/abc/test或者/test/abcd/test都会被该location匹配上

root和alias

参考:root, alias

location /aaa/bbb/ { 
	...
}

如果把/aaa/bbb/定义为uri根路径,那么使用root会在document path后面加上uri根路径,而alias不会。

proxy_pass

参考:proxy_pass

location /abc/ {
	proxy_pass http://ip:port[URI];
}

这里的proxy_pass是ngx_http_proxy_module模块里的,要求后面跟上一个URL,协议可选http或https,最后面的URI可选。
如果把/abc/部分定义为原始uri根路径,那么proxy_pass就分为自带uri和不带uri俩种情况:

  1. 自带uri的,例如proxy_pass http://ip:port/abc/,会用自带的uri替换原始uri根路径
  2. 不带uri的,例如proxy_pass http://ip:port,会使用完整的原始uri

举几个简单的例子:

原始访问地址:http://129.1.1.1/abc/a.html 进行访问。

location /abc/ {
	proxy_pass http://127.0.0.1/;
}
原始uri根路径'/abc/',自带的uri是'/', 代理URL:http://127.0.0.1/a.html

location /abc/ {
	proxy_pass http://127.0.0.1;
}
不自带uri,代理URL:http://127.0.0.1/abc/a.html

location /abc/ {
	proxy_pass http://127.0.0.1/qqq/;
}
原始uri根路径'/abc/',自带uri是'/qqq/',代理URL:http://127.0.0.1/qqq/a.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值