Apache ProxyPassRewrite不会重写从http://test.example.com接收到的响应正文,而仅重写标头(如重定向至404页面等)。
多种选择:
一)重写内部应用程序以使用相对路径,而不是绝对路径。即../css/style.css
代替/css/style.css
2)在相同的子目录中/folder
而不是在test.example.com的根目录中重新部署内部应用程序。
3)通常不会发生一个和两个……如果您很幸运,内部应用程序仅使用两个或三个子目录,而在主站点上未使用这些子目录,只需编写一堆ProxyPass行:
# Expose Internal App to the internet.
ProxyPass /externalpath/ http://test.example.com/
ProxyPassReverse /externalpath/ http://test.example.com/
# Internal app uses a bunch of absolute paths.
ProxyPass /css/ http://test.example.com/css/
ProxyPassReverse /css/ http://test.example.com/css/
ProxyPass /icons/ http://test.example.com/icons/
ProxyPassReverse /icons/ http://test.example.com/icons/
四)为内部应用程序创建一个单独的子域,然后简单地反向代理所有内容:
<VirtualHost *:80>
ServerName app.example.com/
# Expose Internal App to the internet.
ProxyPass / http://test.internal.example.com/
ProxyPassReverse / http://test.internal.example.com/
</VirtualHost>
五)有时,开发人员完全一无所知,他们的应用程序不仅会生成绝对URL,甚至会在其URL中包含主机名部分,并且生成的HTML代码如下所示:<img src=http://test.example.com/icons/logo.png>
。
答:您可以使用水平DNS和方案4的组合解决方案。内部和外部用户都可以使用test.example.com,但是您的内部DNS直接指向test.example.com服务器的IP地址。对于外部用户,test.example.com的公共记录指向您的公共Web服务器www.example.com的IP地址,然后您可以使用解决方案4。
B)实际上,您不仅可以代理到test.example.com的请求,还可以重写响应正文,然后将其传递给用户。(通常,代理仅重写HTTP标头/响应)。Apache 2.2中的mod_substitute。我尚未测试过它是否可以与mod_proxy很好地堆叠,但是也许可以进行以下工作:
<Location /folder/>
ProxyPass http://test.example.com/
ProxyPassReverse http://test.example.com/
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|test.example.com/|www.example.com/folder/|i"
</Location>