2

我们的本地开发设置需要 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}/user1,{DMZ server}/user2等等 。问题是在开发者的盒子上, 的值$_SERVER['HTTP_HOST']只是{DMZ server}没有用户的子目录。期望的行为是/user%/作为真实的主机名。

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

创建子域不是一种选择。

感谢您的任何帮助!

4

3 回答 3

4

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

于 2012-04-23T17:23:24.177 回答
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 标头是一个特殊的 HTTP 标头,通常只包含 HTTP 请求的主机部分,而不是完整的请求 url。

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

于 2012-04-24T19:50:56.893 回答
0

编辑,第三个答案:

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

编辑,第二个答案:

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

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

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

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

ProxyPass /user1/ {user1's IP}/user1/
ProxyPassReverse /user1/ {user1's IP}/user1/

如果我正在设置您似乎想要拥有的那种环境,我希望$_SERVER['HTTP_HOST']{DMZ server}每台开发机器上,以便开发机器的环境看起来就像(或至少更像)在其上运行的代码的生产环境.

于 2012-04-25T02:00:58.293 回答