如果在单个页面应用中加载浏览器,浏览器似乎会忽略图像等资源上的cache-control
标头。
阅读https://madhatted.com/2013/6/16/you-do-not-understand-browser-history并调整他们的演示后,似乎浏览器会通过标记为Content-Control: no-cache must-revalidate
的ajax调用在同一页面上重新检索资源,但是如果我尝试插入一个图像所有适当的E-Tag
& Expiry
标题并包含Content-Control: no-cache must-revalidate
,然后浏览器始终从同一页面的上下文中转到缓存(或者如前面的文章指出的,如果使用后退按钮)
考虑这个简化示例,其中有问题的图片过去有Etag
,Expiry
和Cache-Control: must-revalidate, no-cache
。超时后的第二个图像加载仍然出现以避免任何HTTP请求。
<html>
<body>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
function addImage() {
$('body').append($('<img>',{src:'http://localhost/must-revalidate.png'}));
}
addImage();
setTimeout(addImage, 3000);
});
</script>
</body>
</html>
似乎Chrome会像处理单击后退按钮一样处理对图像的后续请求,因为即使我返回Cache-Control: no-store
,它也具有相同的直接缓存行为。它符合规范:如果实体仍在存储中,即使实体已过期,历史机制也应该显示它,即使请求在技术上与历史后退按钮请求不同。
有没有办法让浏览器尊重SPA中的正常Cache-Control
规则,而不必总是执行缓存破坏,因此从不获得浏览器的好处缓存?