iOS 6 Safari 缓存 $.ajax POST 请求
自 iOS 6 发布以来,用户报告在创建 $ 时出现意外的缓存行为Safari 的 Web 视图中的 .ajax POST 请求。尽管将缓存选项设置为 false,Safari 仍然会缓存响应。
原因
Safari 的激进缓存机制专门针对展示静态函数签名的 POST 请求,其中输入参数保持不变,只有返回的数据发生变化。默认情况下,Safari 会将此类请求视为可缓存,并存储其响应以供将来检索。
解决方案
要避免此缓存问题,请修改函数签名以引入动态范围。例如,不要使用:
getNewRecordID(intRecordType)
使用:
getNewRecordID(intRecordType, strTimestamp)
通过将时间戳或其他动态参数合并到函数签名中,Safari 会将请求识别为唯一的并避免缓存结果.
根本原因
Safari 的缓存行为源于对 HTTP 规范的解释,它允许在包含适当的 Cache-Control 或 Expires 标头时缓存 POST 响应。但是,Apple 的实现将此缓存扩展到了这些标头不存在或设置为“max-age=0”的情况。
No Cache-Control or Expires headers = iOS6 Safari will cache Cache-Control max-age=0 and an immediate Expires = iOS6 Safari will cache Cache-Control: no-cache = iOS6 Safari will NOT cache
解决方法
禁用缓存对于全局所有 POST 请求,将以下行添加到 Apache 配置中:
Header set Cache-Control "no-cache"
或者,您可以将此行为专门限制为 POST 请求:
SetEnvIf Request_Method "POST" IS_POST Header set Cache-Control "no-cache" env=IS_POST
通过修改函数签名并结合这些缓存修改,您可以恢复 iOS 6 Safari 中的预期行为,并确保 POST 请求不会被缓存。
以上是为什么即使缓存设置为 False,iOS 6 Safari 也会缓存 $.ajax POST 请求?的详细内容。更多信息请关注PHP中文网其他相关文章!