Nginx:何时使用proxy_set_header Host $ host vs $ proxy_host

Ale*_*x H 13 proxy reverse-proxy nginx

我一直在阅读反向代理,我想知道何时proxy_set_header Host $host适当proxy_set_header Host $proxy_host.我做了一些研究,在本文中它说,在大多数情况下,我们将Host设置为$ host.那为什么nginx默认为$ proxy_host?为了帮助我更具体地理解,如果我们使用$ proxy_host,这里的反向代理配置(文章的底部)是否仍然有效?

谢谢

Jos*_*ald 18

一般来说,没有必要明确地做,proxy_set_header Host proxy_host因为它是默认的.如果您需要通过指令之外的其他内容调用服务器proxy_pass,则需要覆盖via proxy_set_header something.

如果您想代理您的server_name指令中相同的主机,那么您将有机会使用proxy_set_header $host.如果实际应用程序可能托管在另一个端口或某个内部服务器上,则通常会出现这种情况.

server {
    listen 80;
    server_name site.example.com;

    location / {
       proxy_set_header Host $host;
       proxy_pass http://localhost:8080;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您呼叫上游的名称不是其实际的DNS名称,那么您可能具有以下内容:

# 192.168.2.1 responds to site.example.com, but
# site.example.com doesn't actually resolve to 192.168.2.1
proxy_pass http://192.168.2.1;
proxy_set_header Host site.example.com;
Run Code Online (Sandbox Code Playgroud)

另一种情况可能是"基于名称"的虚拟主机,其中上游有一个有用的DNS名称,但您想通过其他名称来调用它.

proxy_pass http://origin.example.com;
proxy_set_header Host site.example.com
Run Code Online (Sandbox Code Playgroud)

  • 我很难理解“$host”和“$proxy_host”定义的措辞。那么这是错误的吗:客户端向 nginx 服务器 **A** 发送请求,代理将其传递给后端 **B**。那么 `$host` 将是 **A** 的 url,而 `$proxy_host` 将是 **B** 的 url。因此,如果我希望客户端的*未来*请求仍然定向到**A**,我想使用`$host`?那是对的吗? (5认同)
  • @iBug 不!`upstream` 模块将读取适用于其内部阶段的每个设置,然后在发出实际的 `proxy_pass` 时应用。如果配置中“proxy_set_header”位于“proxy_pass”*之后,您将获得完全相同的行为。 (2认同)