当使用 Nginx 作为反向代理时,修改 `Host` 标头还是传递 `X-Forwarded-Host`?

当使用 Nginx 作为反向代理时,修改 `Host` 标头还是传递 `X-Forwarded-Host`?

我正在尝试使用 Nginx 作为反向代理,并且上游服务器是一个 ASP.NET Core 应用程序,我已在其中注册了ForwardedHeadersMiddleware,它将读取三个不同的X-Forwarded-*标题:

  • X-Forwarded-For
  • X-Forwarded-Proto
  • X-Forwarded-Host

现在,我理解了前两个,但发现最后一个(X-Forwarded-Host)令人困惑。我见过 Nginx 反向代理配置通常Host像这样重写标头:

location / {
    proxy_pass http://app;
    proxy_set_header Host $host;
}

但后来我还看到了X-Forwarded-Host被使用的:

location / {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-Host $host;
}

在某些情况下,两者同时使用:

location / {
    proxy_pass http://app;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
}

我不确定我该怎么做。为什么要同时使用两者?X-Forwarded-Host如果人们可以直接更改标题,为什么还要使用标题?我注意到,无论我设置还是(或两者),Host我的 ASP.NET Core 应用程序中的结果都是相同的,无论哪种情况,HostX-Forwarded-HostHttpContext.Request.Host设置为预期值 — — 当然,前提是已注册转发的标头中间件。

令我惊讶的是,我通过谷歌搜索找不到有关此问题的任何相关信息,所以我不得不在这里问这个问题。在这种情况下应该采取什么正确的方法?

相关内容