apache反向代理:如何转发代理服务器的HTTP_HOST

Posted

技术标签:

【中文标题】apache反向代理:如何转发代理服务器的HTTP_HOST【英文标题】:apache reverse proxy: how to forward proxy server's HTTP_HOST 【发布时间】:2012-04-26 18:10:53 【问题描述】:

我们的本地开发设置需要 DMZ 中的一个框,并且每个开发人员在其 apache 配置中都有一行用于代理。看起来像:

ProxyPreserveHost on

ProxyPass /user1/ user1's IP
ProxyPassReverse /user1/ user1's IP

ProxyPass /user2/ user2's IP
ProxyPassReverse /user2/ user2's IP

#etc

我们的公共 URL 变成了DMZ server/user1DMZ server/user2 等。问题是在开发者的盒子上,$_SERVER['HTTP_HOST'] 的值只是DMZ server没有 用户的子目录。期望的行为是将/user%/ 作为真实的主机名。

我尝试过覆盖 HOST var,并重写了一些规则,但没有任何效果。

不能创建子域。

感谢您的帮助!

【问题讨论】:

$_SERVER['HTTP_HOST'] 无论如何只显示主机名或 IP 地址。您需要使用 $_SERVER['REQUEST_URI'] 或类似的东西来获取完整路径。 相信我,我查看了所有 $_SERVER 以获得正确的值。 Besies,我宁愿不运行我运行的所有项目并更改代码。我们使用的 php 框架也依赖 HTTP_HOST。 如果我正确理解了这个问题,希望将 DMZ_SERVER/user% 传递给后端应用程序? 不清楚您要完成什么,甚至不清楚您是如何设置的。 “在开发人员的盒子上,$_SERVER['HTTP_HOST'] 的值只是 DMZ server”是什么意思?开发盒上正在运行什么?你需要在哪里看到DMZ server/user1?您永远不会在任何地方找到/user%/ 作为主机名。您需要以不同的方式解决问题。 @OldPro:我们在 DMZ 中的那台服务器上有几个代理规则,每个规则都连接到办公室的开发人员。为了让我们每个人都有一个唯一的 URL,我们设置了 /%user 路径。在开发应用程序上运行的主要是 apache 和 PHP,用于托管各种应用程序。那么有什么不同的方式呢? 【参考方案1】:

http://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypreservehost 似乎是答案。

【讨论】:

我有(上图),但似乎不是答案。【参考方案2】:

我要试一试并提出以下建议:

SetEnvIf Host (.*) custom_host=$1
RequestHeader set X-Custom-Host-Header "%custom_hoste/%REQUEST_URIe/%QUERY_STRINGe"

这应该希望设置一个名为 X-Custom-Host-Header 的请求标头,然后您可以在 PHP 中获取该标头。如果你愿意,你可以尝试覆盖主机头,但我不确定它的含义。 Host 头是一个特殊的 HTTP 头,通常只包含 HTTP 请求的主机部分,而不是完整的请求 url。

不幸的是,未经测试,但如果您能更详细地说明您在寻找什么,这将有所帮助。

【讨论】:

不幸的是,我无法通过所有代码替换“HTTP_HOST”、“SERVER_NAME”、“SCRIPT_URI”等实例。【参考方案3】:

编辑,第三个答案:

看起来 Apache 之前听说过这个投诉,解决方案是 mod_substitute。您需要使用它来重写文档中返回的所有 URL 以插入 /user1/

编辑,第二个答案:

根据您的 cmets 中的其他信息,我认为您在 DMZ 服务器上的 Apache 配置是正确的。您要求的是让开发人员机器生成包含其上下文路径的 URL(这是 J2EE 术语,类似于您的 /user1/ 位)。我对PHP没有任何经验,所以我不知道它是否有这样的设施,但快速搜索suggests it does not。

否则,您必须推出自己的函数,将相对 URL 转换为绝对 URL,使其可配置,以便您可以让它在主机名中添加一些内容,然后强制每个人都使用该函数专门用于生成网址。有关查找本地文件的相关问题的解决方案,请参阅 this old (outdated?) PHP best practices article 中的“使您的应用程序位置独立”以获取一些指导。

上一个答案:(不起作用,导致重定向循环)

我仍然不清楚您要做什么或“在开发应用程序上运行主要是 apache 和 PHP,用于托管各种应用程序”是什么意思,但作为有根据的猜测,您是否尝试过:

ProxyPass /user1/ user1's IP/user1/
ProxyPassReverse /user1/ user1's IP/user1/

如果我要设置您似乎想要的那种环境,我希望在每台开发机器上都将$_SERVER['HTTP_HOST'] 设置为DMZ server,这样开发机器的环境看起来就像(或至少更多)像)生产到运行在它上面的代码。

【讨论】:

这实际上导致了我的重定向循环。 目标是为每个开发人员提供一个唯一的公共 URL,该 URL 可以正确转发到他们的计算机。真的是这样。当 PHP 需要构造 URL 时(例如,对于图像),它使用 $_SERVER['SERVER_NAME'] 或 'HTTP_HOST',在这种情况下是不正确的。我认为子域会很完美。 @Ethan,子域将是理想的。您在 J2EE 中所做的事情很容易,因为它具有应用程序上下文的概念,并且您构造的 url 不是相对于主机名而是相对于上下文,在您的情况下是主机名加上 /user1/。我不知道 PHP 服务器和应用程序是如何设置的。原则上,我会编写一个将相对 URL 转换为绝对 URL 的函数,使其可配置,以便您可以让它在主机名中添加一些内容,然后强制每个人专门使用该函数来生成 URL。

以上是关于apache反向代理:如何转发代理服务器的HTTP_HOST的主要内容,如果未能解决你的问题,请参考以下文章

nginx学习之反向代理

apache反向代理tomcat的两个代理模式及相关的会话保持配置示例

从端口80到端口8000的Apache反向代理配置

反向代理负载均衡之APACHE

Apache端口转发[关闭]

怎么配置反向代理 apache