今天早上我在尝试访问我正在使用 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 压缩响应,或者我是在吠叫错误的树吗?