自从升级到 iOS 6 以来,我们看到 Safari 的网页视图擅自缓存$.ajax
来电。这是在 PhoneGap 应用程序的上下文中,因此它使用 Safari WebView。我们的$.ajax
电话是POST
方法并且我们将缓存设置为 false{cache:false}
,但这种情况仍在发生。我们尝试手动添加TimeStamp
到标题,但没有帮助。
我们做了更多研究,发现 Safari 只返回具有静态函数签名且不会因调用而变化的 Web 服务的缓存结果。例如,想象一个函数,名为:
getNewRecordID(intRecordType)
该函数一遍又一遍地接收相同的输入参数,但每次返回的数据都应该不同。
苹果一定是急于让 iOS 6 快速发展,他们对缓存设置太满意了。还有其他人在 iOS 6 上看到过这种行为吗?如果是这样,到底是什么原因造成的?
我们发现的解决方法是将函数签名修改为如下所示:
getNewRecordID(intRecordType, strTimestamp)
然后总是传入一个TimeStamp
参数也是如此,只需在服务器端丢弃该值即可。这可以解决这个问题。
经过一番调查后发现,iOS6 上的 Safari 会缓存没有 Cache-Control 标头甚至“Cache-Control: max-age=0”的 POST。
我发现防止这种缓存在全局级别发生的唯一方法是设置“Cache-Control: no-cache”,而不必在服务调用结束时破解随机查询字符串。
So:
- 没有 Cache-Control 或 Expires headers = iOS6 Safari 将缓存
- Cache-Control max-age=0 且立即过期 = iOS6 Safari 将缓存
- Cache-Control: no-cache = iOS6 Safari 不会缓存
我怀疑 Apple 正在利用 HTTP 规范中关于 POST 的 9.5 节中的这一点:
对此方法的响应不可缓存,除非响应
包括适当的 Cache-Control 或 Expires 标头字段。然而,
303(查看其他)响应可用于引导用户代理
检索可缓存资源。
所以理论上你可以缓存 POST 响应......谁知道呢。但到目前为止,还没有其他浏览器制造商认为这是一个好主意。但这并不能说明未设置 Cache-Control 或 Expires 标头时的缓存,仅当设置了某些标头时才考虑。所以这一定是一个错误。
下面是我在 Apache 配置的正确部分中使用的内容来定位整个 API,因为实际上我不想缓存任何内容,甚至不想缓存任何内容。我不知道如何仅针对 POST 进行设置。
Header set Cache-Control "no-cache"
更新:刚刚注意到我没有指出只有当 POST 相同时才有效,因此更改任何 POST 数据或 URL 就可以了。因此,您可以像其他地方提到的那样,仅向 URL 添加一些随机数据或一些 POST 数据。
更新:如果您希望在 Apache 中这样,您可以将“无缓存”限制为仅用于 POST:
SetEnvIf Request_Method "POST" IS_POST
Header set Cache-Control "no-cache" env=IS_POST
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)