今天早上,我在尝试访问我正在使用 iPad (Safari Mobile/Webkit) 构建的网络应用程序时遇到了一个非常奇怪的问题。在前端,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) 请求时需要内容长度 header 。在我的例子中,服务器将内容直接 gzip 到输出流,所以我无法知道最终内容的长度。
作为解决方法,我在服务器上添加了以下逻辑:
if (request.isEncrypted()) gzip =
!request.getHeader("User-Agent").toLowerCase().contains("webkit");
换句话说,如果连接是通过 SSL 加密的,并且浏览器是一些 webkit 衍生产品(例如 Safari、Chrome 等),那么不要压缩输出。这似乎有效,但它确实减慢了速度。
所以我的问题是:
Safari 是否支持通过 SSL 的 gzip 压缩响应,还是我找错了树?
最佳答案
原来我看到的错误是服务器中的错误,与 Safari 无关。服务器在压缩大字节数组时依赖于分块传输编码。单独的“ block ”被分解成片段(标题、正文、尾部)并在单独的消息中发送给客户端。 SSL 客户端(safari)期待一个连续的“ block ”,所以当它看到一个不完整的 block 时不知道该怎么做。服务器已打补丁,问题现已解决。
关于ssl - 使用 Safari 通过 SSL 进行 Gzip 压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12978583/