Apache2 - 使用mod_rewrite代理另一个域

时间:2015-05-12 20:08:30

标签: mod-rewrite url-rewriting apache2.4

我正在运行Apache 2.4并使用mod_rewrite来实现以下功能 - 我需要代理几个不同的内部站点,以便它们看起来已经托管在同一台服务器上。举个例子,我希望这样做的方式是拥有http://myserver/osnews形式的URL 这将代理来自www.osnews.comhttp://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

谢谢!

1 个答案:

答案 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。但我希望最终能解决这些问题。