【问题标题】:Change Host header in nginx reverse proxy更改 nginx 反向代理中的主机标头
【发布时间】:2012-12-30 10:25:27
【问题描述】:

我正在运行 nginx 作为站点 example.com 的反向代理,以对后端服务器中运行的 ruby​​ 应用程序进行负载平衡。我在 nginx 中有以下 proxy_set_header 字段,它将主机头传递给后端 ruby​​。这是 ruby​​ 应用程序识别子域名所必需的。

location / {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host $http_host;
}

现在我想创建一个别名beta.example.com,但传递给后端的主机头仍应为www.example.com,否则ruby 应用程序将拒绝请求。所以我想要类似于下面的内部位置指令。

if ($http_host = "beta.example.com") {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host www.example.com;
}

最好的方法是什么?

【问题讨论】:

标签: nginx


【解决方案1】:

你不能在 if 块中使用 proxy_pass,所以我建议在设置代理头之前做这样的事情:

set $my_host $http_host;
if ($http_host = "beta.example.com") {
  set $my_host "www.example.com";
}

现在你可以只使用 proxy_passproxy_set_header 没有 if 块:

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_host;
}

【讨论】:

  • 我应该在什么范围内编写 if 语句?服务器或位置?
【解决方案2】:

map 优于 set + if

map $http_host $served_host {
    default $http_host;
    beta.example.com www.example.com;
}

server {
    [...]

    location / {
        proxy_pass http://rubyapp.com;
        proxy_set_header Host $served_host;
    }
}

【讨论】:

  • 在 nginx 文档中,提到 set 和 if 如果不在该位置但在服务器内就可以了。不过,地图也是一个不错的选择。
  • 你能找到你提到的文档吗?我从来没有读过那个。此外,涉及if 的 nginx 票证经常指出与其使用相关的问题。例如:#1383。避免使用setif 的建议仍然有效。
【解决方案3】:

我试图解决同样的情况,但使用uwsgi_pass

经过一番研究,我发现在这种情况下,需要:

uwsgi_param HTTP_HOST $my_host;

希望对其他人有所帮助。

【讨论】:

  • 这正是我想要的,非常感谢!
【解决方案4】:

只是一个小提示。有时您可能需要使用 X-Forwarded-Host 而不是 Host 标头。这就是我的主机标头工作但仅适用于标准 HTTP 端口 80 的情况。如果应用程序暴露在非标准端口上,那么当应用程序生成重定向时该端口会丢失。所以最后对我有用的是:

proxy_set_header X-Forwarded-Host $http_host;

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2021-01-03
    • 2017-09-25
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多