apache reverse proxy:如何转发代理服务器的HTTP_HOST

时间:2012-04-14 19:39:19

标签: apache proxy reverse-proxy http-host

我们的本地开发设置需要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

我们的公开网址变为{DMZ server}/user1{DMZ server}/user2等。问题就是在开发框中,$_SERVER['HTTP_HOST']的值只是{{1 ,没有用户的子目录。期望的行为是将{DMZ server}作为真正的主机名。

我已经尝试重写HOST var和一些重写规则,但没有任何效果。

创建子域不是一种选择。

谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我要采取刺激并建议:

SetEnvIf Host (.*) custom_host=$1
RequestHeader set X-Custom-Host-Header "%{custom_host}e/%{REQUEST_URI}e/%{QUERY_STRING}e"

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

不幸的是,未经测试,但如果你能更详细地澄清一下你在寻找什么,这将有所帮助。

答案 2 :(得分:0)

编辑,第三回答:

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

编辑,第二回答:

根据您评论中的其他信息,我会说您的DMZ服务器上的Apache配置是正确的。您要求的是让开发人员机器生成包含其上下文路径的URL(这是类似于您的/user1/位的J2EE术语)。我没有任何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},这样开发机器的环境看起来就像(或者至少更像是对其上运行的代码进行生产。