Safari 将 URL # 片段合并到其浏览器缓存中
Safari incorporating URL # fragment into its browser caching
我正在研究一个解决方案来加速我们的网站。 我让客户端首先 ajax 加载应用程序的预期下一页:
$.ajax({url: '/some/real/path', ...});
服务器对此做出响应,并在标头中包含:
Cache-Control => 'max-age=20'
这会将响应标记为可缓存。
然后,客户端应用程序等待查看其预测是否正确,并在发现正确后,将浏览器转换为同一页面,但将一些信息作为 # 片段添加到 URL 中,其中只有当用户实际提交其操作(即不可预测(时,我们才能获得此信息:
location.href = '/some/real/path#additionalInfoInFragement';
当浏览器过渡到页面时,片段中的附加信息被该页面的javascript拾取,并在那里实现一些效果。
对于所有浏览器,包括 Safari,对启动 ajax 请求的响应已正确插入到浏览器缓存中。
然后,对于除 Safari 之外的所有浏览器,当我们影响 location.href 过渡到该页面时,浏览器会将该内容从缓存中提取出来。 这避免了服务器命中,是我们加速的基础。
不过,Safari 没有使用缓存来重新提供内容。 它似乎被过渡的"#additionalInfoInFragment"部分绊倒了。 它将片段包含在用于检查现有缓存内容的缓存键的构造中。 以下是 Safari 的 cache.db 文件中的条目,我通过 sqlite 转储了这些文件:
* ajax request: INSERT INTO "cfurl_cache_response" VALUES(3260,0,-1982644086,0,'http://localhost:8080/TomcatScratchPad/EmptyPage','2012-05-14 07:01:10');
* location.href transition: INSERT INTO "cfurl_cache_response" VALUES(3276,0,-230554366,0,'http://localhost:8080/TomcatScratchPad/EmptyPage#wtf','2012-05-14 07:01:20');
同样值得注意的是,Chrome的行为是正确的,尽管两者都共享大量的WebKit代码。
我真的很感激社区的任何想法。 谢谢!
我只看到几个选项:
-
向Apple提交错误报告,不要担心。您的缓存内容仍然适用于其他浏览器。总体而言,Safari的市场份额非常小,当然,如果您的网站针对(例如(iPad或iPhone用户,那反而会改变您特定网站的统计数据的性质。:-)(您可能从日志中知道您的 Safari 受众有多大。
子类别:如果 Safari 是您目标市场的重要组成部分,这确实困扰您,请查看它是否是其任何开源部分中的错误,如果是,请提供补丁。
-
不要使用片段标识符来传递信息,而是使用其他东西(也许是 cookie(。
- image.onload事件和浏览器缓存
- 微软边缘浏览器缓存中的RESTful Angular应用程序
- 使用查询字符串方法清除浏览器缓存
- 浏览器缓存PHP生成的CSS和Javascript文件
- 阻止浏览器缓存上载的图像
- 停止浏览器缓存文本文件
- 从浏览器缓存渲染的页面
- 如何强制从浏览器缓存重新加载当前页面
- 在jquery中按Ctrl+F5清除浏览器缓存
- 如何在注销后从服务器重新加载angular应用程序,而不使用浏览器缓存
- 有没有任何方法可以使用js清除浏览器缓存,至少是我的域相关文件
- mvc项目中javascript和css文件的浏览器缓存
- 阻止浏览器缓存AJAX请求
- 如何使用jquery将ajax响应存储在浏览器缓存中
- 有没有办法防止浏览器缓存滚动位置和缩放级别等值
- 咖啡脚本和浏览器缓存
- 使用 AJAX 提交时使浏览器缓存表单数据
- 检查对象是否适合浏览器缓存
- 浏览器缓存是否知道javascript xmlhttp请求
- $('#textboxId').val() 返回旧值(浏览器缓存问题)