我正在运行Apache 2.4并使用mod_rewrite来实现以下功能 - 我需要代理几个不同的内部站点,以便它们看起来已经托管在同一台服务器上。举个例子,我希望这样做的方式是拥有http://myserver/osnews
形式的URL
这将代理来自www.osnews.com
和http://myserver/slashdot
的内容,该内容将代理来自www.slashdot.org
的内容。我在apache conf文件中定义了以下重写规则:
RewriteCond %{REQUEST_URI} ^/osnews(/?.*) [NC]
RewriteRule ^/osnews(.*) http://www.osnews.com$1 [P]
RewriteCond %{REQUEST_URI} ^/slshdot(/?.*) [NC]
RewriteRule ^/osnews(.*) http://www.slashdot.org$1 [P]
问题是这会破坏代理网站上的所有样式表和图像。我认为这是因为重写的网址格式为http://myserver/story/28554/Russia_unveils_homegrown_PC_microprocessor_chips
而不是http://myserver/osnews/story/28554/Russia_unveils_homegrown_PC_microprocessor_chips
相反,如果我尝试这样的事情,它就可以正常工作(我没有将网站作为原始网址的一部分,因此http://myserver
只会代理http://www.osnews.com
):< / p>
RewriteCond %{HTTP_HOST} ^myserver$ [NC]
RewriteRule ^ http://www.osnews.com%{REQUEST_URI} [P]
所以,我需要指导的是如何在代理从http://mysite/osnews/some-resource
返回后保留网址http://osnews.com/some-resource
谢谢!
答案 0 :(得分:0)
所以,我使用mod_proxy而不是mod_rewrite。我使用的配置(在VirtualHost上下文中)是:
ProxyPass /osnews.com/ http://www.osnews.com/
ProxyHTMLURLMap http://www.osnews.com /osnews.com
#LogLevel debug proxy_html:trace5
<Location /osnews.com/>
ProxyPassReverse /osnews.com/
ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLURLMap ^/ /osnews.com/ R
ProxyHTMLURLMap ^/css/(.*) /osnews.com/css/$1 Rc
ProxyHTMLURLMap ^/images/(.*) /osnews.com/images/$1 Rc
RequestHeader unset Accept-Encoding
</Location>
需要注意的一点是,如果你在Ubuntu上使用apache2(在我的情况下是Lubuntu 15.04),默认情况下不会提供mod proxy_html的配置文件。您需要创建它,然后使用a2enmod proxy_html
启用它。本文总结了这一点:http://ckdake.com/content/2008/reverse-proxying-with-apache-and-modproxyhtml.html。
我仍然看到一些问题,其中ProxyHTMLExtended输出过滤器没有正确映射URL。但我希望最终能解决这些问题。