Nginx中的proxy_pass

255 阅读1分钟

官方文档地址:nginx.org/en/docs/htt…

proxy_pass 语法:

Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
  • 设置代理服务器的协议和地址,以及应将位置映射到的可选URI
  • 协议可以为http或https
  • 地址可以是域名或者ip和端口号
proxy_pass http://localhost:8000/uri/;

想测试一下proxy_pass在代理转发的时候,跟所匹配的location的路径参数的问题。

官网将proxy_pass 代理转发的url分为2种:

第一种:路径中包含uri的,最后以/结尾,那么,当请求传递到服务器的时候,规范化请求URI中与location匹配的部分被proxy_pass指令中指定的URI代替。

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

# 请求 http://example.com/name/test.html 会被代理到 http://127.0.0.1/remote/test.html

第二种:路径中没有uri的,只有域名或IP和端口的,且结尾没有/,请求的URI将以与原来客户端发送的格式相同的形式传递到服务器, 或者是将规范化的请求URI完整的传递给改变后的URI。

location /some/path/ {
    proxy_pass http://127.0.0.1;
}

# 请求http://example/some/path/test.html 会被转发到 http://127.0.0.1/some/path/test.html

但是在有些情况下,并不确定哪一部分请求的uri需要被替换。

  • 当location被指定了正则表达式的时候,proxy_pass不能指定uri。
  • 在proxy_pass前面使用了rewrite,如下,这种情况下,proxy_pass是无效的。

关于斜杠的问题

使用proxy_pass做代理转发的时候,如果是上述问题的第一种情况,建议location和proxy_pass 后面的值最后都以斜杠/结尾,统一起来,要不然会出现问题,下面的博客有整理:

Nginx中proxy_pass的斜杠问题