【问题标题】:How to get reverse proxy’s HTTP_HOST from internal application server如何从内部应用服务器获取反向代理的 HTTP_HOST
【发布时间】:2016-09-10 05:45:16
【问题描述】:

反向代理服务器将请求转发到内部应用程序服务器。代理服务器将其 HTTP_HOST 值设置为用于访问站点的主机名,例如:www.example.comwww.alias2.comwww.alias3.com

内部服务器接收到其内部 IP 地址的请求,因此其 HTTP_HOST 值设置为:192.168.64.2

内部应用服务器如何确定原始http请求中的Host:使用了哪个域名?

可以将SERVER_NAME 配置为应用程序使用的主机名,但是如果许多不同的主机名别名都可以访问该网站,我们如何知道使用了哪一个?

查看应用服务器上 Apache 可用的所有环境变量,除了HTTP_REFERER(显然不能依赖)之外,没有一个表示请求的主机名:

[HTTP_HOST] => 192.168.64.2:80
[SERVER_NAME] => 192.168.64.2
[REMOTE_ADDR] => 192.168.64.1
[SERVER_ADDR] => 172.19.0.3
[SCRIPT_URI] => http://192.168.64.2:80/index.php
[HTTP_REFERER] => http://www.example.com/prev/

我知道一些反向代理可以配置为转发原始请求中使用的主机名。我是笼统地问这个问题,因为我想知道是否有不是特定于代理的解决方案。目前我在开发过程中使用 BrowserSync 作为反向代理,这似乎没有办法转发 http 主机,无论如何,我希望能够设计我的应用程序以便它不会'不要依赖提供此信息的反向代理。

【问题讨论】:

  • 您如何看待这个工作?如果您为多个主机名提供服务,但反向代理只是没有告诉您使用哪个主机名,您还可以从哪里实际获取这些信息?

标签: apache http proxy


【解决方案1】:

过去通常通过设置非标准的X-Forwarded-For 标头来解决您要查找的内容。这已被 RFC 7239 中定义的 Forwarded 标头取代。与您相关的部分是section 5.3

X-Forwarded-For 已经使用 the de-facto standard 很长时间了,因此对它的工具支持通常会更好。例如。 nginx通过$proxy_add_x_forwarded_for支持,可以方便的设置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Apache 通过mod_proxy 提供类似的功能。在撰写本文时,有 an open ticket for mod_proxy_http regarding 支持 Forwarded:

在接收端,有mod_rpaf 用于apache,它是根据X-Forwarded-For 标头设置各种环境变量。

至于 Browsersync:我认为您可以通过 proxy.reqHeaders 指令设置所需的标头。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2018-02-16
    • 2017-08-16
    • 2020-01-12
    相关资源
    最近更新 更多