nginx一个常用的功能就是作为反向代理服务器,涉及到的一个语法就是proxy_pass,作用是将匹配的请求转发到特定的后端服务器,但这个语法在转发过程中有可能会对请求的uri进行更改,下面我们就来说一下proxy_pass转发时的uri替换规则。
这里依旧粗略的了解一下网址的组成,假设有个网址链接为 http://192.168.1.1:8080/abc/ABC.html ,那么http则是协议,192.168.1.1 是主机 , 8080是端口 , /abc/ABC.html 则是uri
重点仍然是uri部分,下面先上相关官网文档链接
直接拿官方例子说明一下
最常见的两种情况:
第一种:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
上面的proxy_pass语法后存在 uri,也就是标红的部分,当客户端访问的请求为 http://192.168.1.1/name/WhoAreYou/where.html,那么经由上面的配置后,nginx会将请求变成http://127.0.0.1/remote/WhoAreYou/where.html然后进行发送。也就是会进行相应的uri替换。 第二种: location /name/ { proxy_pass http://127.0.0.1; }
而以上的情况下,由于proxy_pass语法后没有 uri,那么将会拼接原始的uri进行转发,也就是客户端访问的请求为 http://192.168.1.1/name/WhoAreYou/where.html,nginx发送的请求 http://127.0.0.1/name/WhoAreYou/where.html
但是在某些条件下,替换的uri是没办法确定的:
1、匹配的location是正则表达式类型的,
proxy_pass后边的链接不能包含uri
2、在proxy_pass之前匹配rewirte规则重写了uri,将使用相同的配置来处理请求 ( break
),这种情况下,即使proxy_pass后边包含了uri也会被忽略,但是如果不匹配rewrite规则,则按照常规的第二种处理方式一致。
location /name/ { rewrite /name/(.*)\.html /users?name=$1 break; proxy_pass http://127.0.0.1/whoami/; }
例如http://192.168.1.1/name/WhoAreYou/where.html访问后会转换成http://127.0.0.1/users?name=WhoAreYou/where
但http://192.168.1.1/name/WhoAreYou/where.txt访问后会转换成http://127.0.0.1/whoami/WhoAreYou/where.txt
3、在proxy_pass语法中使用了变量,那么这种情况跟常规的第二种处理方式是一样的
location /name/ {
proxy_pass http://127.0.0.1$request_uri;
}