2012-10-19 58 views
1

今天早上我尝试访问我使用iPad(Safari Mobile/Webkit)构建的Web应用程序时遇到了一个非常奇怪的问题。在前端,Web应用程序严重依赖于XHR/Ajax请求。在后端,如果“Accept-Encoding”包含“gzip”,则服务器配置为gzip压缩响应。使用Safari对SSL进行Gzip压缩?

一切都很好,直到我翻转服务器到SSL。然后我开始在Safari中出现间歇性的“CFURLErrorDomain:303”错误。

快速搜索后,我发现这个链接:

http://beyondrelational.com/modules/2/blogs/45/posts/12034/failed-to-load-resource-safari-issue.aspx

根据该链接时,Safari使得通过SSL/HTTPS XHR(AJAX)请求时需要一个内容长度报头。就我而言,服务器直接将内容压缩到输出流,所以我无法知道最终内容的长度。

作为一种变通方法,添加以下逻辑服务器上:

if (request.isEncrypted()) gzip = 
     !request.getHeader("User-Agent").toLowerCase().contains("webkit"); 

换言之,如果连接是通过SSL加密的,并且浏览器是一些WebKit的衍生物(例如野生动物园,铬等),那么不要压缩输出。这似乎工作,但它真的放慢了速度。

所以我的问题是这样的:

Safari浏览器是否支持gzip压缩了SSL响应还是我找错了树?

回答

1

发现我看到的错误是服务器中的错误,与Safari无关。压缩大型字节数组时,服务器依靠分块传输编码。单独的“块”被分成片段(标题,正文,预告片),并以单独的消息发送给客户端。 SSL客户端(safari)期待一个连续的“块”,因此当它看到一个不完整的块时,不知道该怎么做。服务器已修补,问题现在已解决。

+0

我有同样的问题,我认为。你是如何修补你的服务器来解决这个问题的?我想我需要做类似的事情,看起来你也使用Java。 – chubbsondubs