我正在研究加速我们网站的解决方案。我首先让客户端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代码。
我真的很感激社区有任何想法。谢谢!
答案 0 :(得分:1)
我只看到几个选项:
向Apple提交错误报告,不要担心。 :-)你的缓存内容仍适用于其他浏览器。总体而言,Safari有一个very small market share,当然,如果您的网站针对(比如说)iPad或iPhone用户,那么这会改变您特定网站的统计信息的性质。 :-)(你可能从你的日志中知道你的Safari用户有多大。)
子类别:如果Safari是您目标市场的重要组成部分,这真的让您感到困扰,请查看它是否是其中任何开源部分的错误,如果是,则提供补丁。
不要使用片段标识符来传递信息,而是使用别的东西(也许是cookie)。