1

今天早上我在尝试访问我正在使用 iPad(Safari Mobile/Webkit)构建的 Web 应用程序时遇到了一个非常奇怪的问题。在前端,Web 应用程序严重依赖 XHR/Ajax 请求。在后端,如果“Accept-Encoding”包含“gzip”,则服务器配置为 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、Chrome 等),那么不要压缩输出。这似乎有效,但它确实减慢了速度。

所以我的问题是:

Safari 是否支持通过 SSL 的 gzip 压缩响应,或者我是在吠叫错误的树吗?

4

1 回答 1

1

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

于 2013-01-08T15:49:07.457 回答