使用mod_include和mod_proxy包含远程.shtml文件时出现乱码文本

时间:2013-02-19 14:51:20

标签: apache mod-proxy mod-include

我正在尝试使用apache mod_include。

我有两个运行apache的服务器:我正在尝试在test_local.shtml(server1)中包含一些来自test_remote.shml(server2)的简单文本。

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行更改为:

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

这次没有错误,包含了一些内容,但结果文本都是乱码:

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

我在配置中遗漏了什么?怎么了?

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

更新2:在server2上禁用SetOutputFilter DEFLATE,server1上的mod_include附带的文本是完全可读的。这就是问题的根源:如何配置server1来处理gzip压缩内容并正确显示? (Hypotetically我想象某种inputfilter与outputfilter相反......)

1 个答案:

答案 0 :(得分:2)

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

解决方案1:

通过将以下内容添加到远程服务器配置,我们禁用.shtml文件的gzip压缩:

<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>

基本上,我告诉Apache禁用Accept-Encoding请求标头;当请求.shtml页面到远程服务器时,我们要求页面没有压缩。因此,我们得到纯文本,避免出现乱码。

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