我的 apache 服务器(在 debian 6.0.5 上运行的 v2.2.16)遇到了一个非常奇怪的问题。我启用了 mod_deflate 来提供经过 gzip 压缩的内容,在 chrome、firefox 和 ie 中,它运行正常,没有问题。然而,在 Safari 中,只接收和解压了部分内容。
另一件需要注意的事情是:Apache 前面有一个 Nginx 服务器,用于代理内容 - 因此请求将到达 nginx,代理到 apache,然后将答案返回到 nginx,然后将其发送回去。但是,Apache 服务器会执行 gzipping - nginx 服务器上的 gzipping 已关闭。
该页面是http://www.fastaval.dk/aktiviteter/rollespil/
尝试使用 W3Cs 验证器测试页面时也会出现同样的问题:http://validator.w3.org/check?uri=http%3A%2F%2Fwww.fastaval.dk%2Faktiviteter%2Frollespil%2F&charset=%28detect+automatically%29&doctype=Inline&group=0 这也是有问题的,表明 gzip 压缩的内容以某种方式被破坏了。
但是,如果我尝试下载 gzip 文件并用 gunzip 手动解压,我会得到一个完全有效的 gzip 文件。我尝试使用 wget 和 curl - 两者都输出有效文件,没有问题。
除了禁用 Safari 的 mod_deflate 之外,我该如何解决此问题?什么可能导致此问题?
答案1
这取决于多种因素。
Chunked
content-transfer 不会发送 Content-Length: 标头,因此代理必须先接收整个文件才能知道大小。这可能会以各种方式干扰客户端,您的 Safari 测试似乎就是这种情况。
我建议您对一些流量进行 tcpdump,看看 Safari 和 FF 之间是否存在标头差异。
如果它似乎纯粹是在客户端,即 Safari 如何解释内容,那么您可能必须添加一个或两个 BrowserMatch 以跳过该客户端的 deflate。