浏览器忽略缓存控制

时间:2016-08-18 01:20:22

标签: single-page-application browser-cache cache-control etag

如果在单个页面应用中加载浏览器,浏览器似乎会忽略图像等资源上的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,然后浏览器始终从同一页面的上下文中转到缓存(或者如前面的文章指出的,如果使用后退按钮)

考虑这个简化示例,其中有问题的图片过去有EtagExpiryCache-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规则,而不必总是执行缓存破坏,因此从不获得浏览器的好处缓存?

0 个答案:

没有答案