我们接到一些零星的客户电话(不到 0.1% 的用户)抱怨无法访问我公司的网站——要么是空白页(如果他们使用 IE),要么是“内容编码错误”表示该页面使用了无效或不受支持的压缩形式(如果他们使用 FireFox)。
当前的怀疑是,当 HTTP 1.1 浏览器请求通过 HTTP 1.0 代理时,我们发送回压缩的 HTTP 1.1 浏览器请求,该请求以某种方式被 HTTP 1.0 代理破坏。
该网站是一个 Tomcat 4.2.2 后端,带有一个 IIS 6.0 前端,在 IIS 服务器上启用了 GZIP 和 DEFLATE。
有没有人遇到过这种错误?是否有推荐的修复方法来避免破坏旧的代理实现?
编辑:我们可以使用 squid-2.5 的默认设置来复制问题,但是新版本的 squid 似乎工作得很好。
好吧,我想我们已经想通了……
在客户端,Squid 2.5 及更早版本不理解“Transfer-encoding: chunked”,因此它将每个块作为整个客户端请求传递。由于它只是整个压缩请求的 1 块,因此它是无效数据,无法被浏览器读取。(不确定这是否是其他代理的问题)
在服务器端,IIS 总是为动态压缩发送分块编码(因为 IIS 不缓存应用程序响应,它必须动态压缩每个响应,因此是分块编码)。
我们能想到的解决此问题的唯一方法是完全禁用对 HTTP 1.0 客户端的压缩,并且只对 HTTP 1.1 响应进行压缩。缺点是发送 1.0 请求的代理后面的任何人都不会获得压缩数据,并且这些用户的站点加载速度会慢 0.5 - 1 秒。
在 metabase.xml 文件中所做的更改:
如果有人有更好的解决方案,请告诉我!
如果这是可重现的,那么我将首先检查发送给客户端的响应标头,以确保在请求/响应流中的某处存在 1.0 代理,如 Via: 响应标头中所示。如果不是,那么你很可能是在找错树了。代理必须在请求/响应流的两个方向插入此标头和它们使用的协议。