2013-02-19 92 views
2

我正在尝试使用apache mod_include。我试图在我的test_local.shtml(server1)中包含一些来自test_remote.shml(server2)的简单文本。使用mod_include和mod_proxy包含远程.shtml文件时出现乱码文本

test_local.shtml

<html> 
    <head> 
    <title></title> 
    </head> 
    <body> 
    <!--#include virtual="http://www.server2.com/test_remote.shtml"--> 
    </body> 
</html> 

test_remote.shtml

<b>this is a test</b> 

起初,它没有工作(有 “文件不存在” 错误error_log中)。 看起来出于安全原因,我管理的唯一文件位于本地服务器(server1)上,具有本地路径,但不是远程URL。 然后我明白我需要将mod_proxy(和mod_proxy_html)与mod_include结合使用,以实现远程包含工作。

所以我增加了以下我的httpd.conf(Server1上):

ProxyPass /server2 http://www.server2.com 

然后,我改变了包括test_local.shtml到行:

<!--#include virtual="/server2/test_remote.shtml"--> 

没有错误这一次,东西得到包括,但由此产生的文字全是乱码:

‹³I²+ÉÈ,V¢D…’Ôâý$;.j¿è 

我在配置中丢失了什么?怎么了?

更新:我怀疑这是两个服务器之间发送(然后读取)数据的方式,如压缩或类似的。我检查了mod_deflate配置部分,它包含在两个服务器中,并且都是一样的。任何想法?谢谢

UPDATE 2:禁用server2上的SetOutputFilter DEFLATE,server1上的mod_include包含的文本是完全可读的。所以这就是问题的根源:我如何配置server1来处理gzip内容并正确显示它? (Hypotetically我想像某种inputfilter反对outputfilter ..)

回答

2

我发现了两种解决方案,但我更喜欢第二个,因为它不需要更改远程服务器的配置。

解决方案1:

加入以下到远程服务器的配置,我们禁用gzip压缩的文件的.shtml:

<IfModule mod_deflate.c> 
    SetEnvIfNoCase Request_URI \.shtml$ no-gzip dont-vary 
</IfModule> 

这不是对我最好的解决方案,因为我并不总是可以访问包含内容的远程服务器。

解决方案2:

在 “本地” 服务器(一个主机使用SSI包含页),增加以下内容:

ProxyPass /server2 http://www.server2.com/ 
ProxyPassReverse /server2 http://www.server2.com/ 
<Location "/server2/"> 
    RequestHeader unset Accept-Encoding 
</Location> 

基本上,我告诉阿帕奇禁用Accept-Encoding请求头;当向远程服务器请求.shtml页面时,我们问页面而不压缩。因此,我们可以获得纯文本,避免出现乱码。

更多信息:http://wiki.apache.org/httpd/ReInflating

相关问题