Safari将URL#fragment合并到其浏览器缓存中

时间:2012-05-14 13:31:36

标签: javascript ajax caching safari fragment

我正在研究加速我们网站的解决方案。我首先让客户端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代码。

我真的很感激社区有任何想法。谢谢!

1 个答案:

答案 0 :(得分:1)

我只看到几个选项:

  1. 向Apple提交错误报告,不要担心。 :-)你的缓存内容仍适用于其他浏览器。总体而言,Safari有一个very small market share,当然,如果您的网站针对(比如说)iPad或iPhone用户,那么这会改变您特定网站的统计信息的性质。 :-)(你可能从你的日志中知道你的Safari用户有多大。)

    子类别:如果Safari是您目标市场的重要组成部分,这真的让您感到困扰,请查看它是否是其中任何开源部分的错误,如果是,则提供补丁。

  2. 不要使用片段标识符来传递信息,而是使用别的东西(也许是cookie)。