【发布时间】:2018-06-27 06:46:20
【问题描述】:
为了提供背景,我有一个非常大的 js 文件,它是在脚本标签中动态加载的。该文件由客户端不时更改。如果没有更改,我们不希望重新加载。
所以,我浏览了许多关于必须重新验证的 stackoverflow 文章。 基于此,我将缓存头实现为如下所示
Cache-Control: must-revalidate,max-age=0
我也启用了 ETag。 根据我的阅读和理解,这应该检查更改并仅在有任何更改时才加载
问题是在 Firefox 和 Chrome 中,无论是否有更改,都会下载文件。即即使文件和 Etag 未更改,浏览器也不会从缓存中加载。
在这种情况下发生了什么? 我在这里做错了吗? 我应该在使用 must-revalidate 时设置 long maxage,而不是将 maxage 设置为零?
我正在编辑这个问题,因为我在进一步检查时发现了一些重要的东西。请在发布答案之前阅读以下内容。
上面描述的这个问题似乎只发生在动态加载的资源上。
例如: 如果我在页面源中有一个脚本标签
<script src="some-js.js" type="text/javascript">
这尊重了必须重新验证的缓存标头。除非有更改,否则不会重新加载。
但是,如果脚本标签是动态加载的(粘贴我的代码以加载下面的动态脚本标签)
var s = document.createElement('script');
s.setAttribute('src', 'newjs.js');
s.setAttribute('id', 'script1');
s.type = 'text/javascript';
s.async = false;
s.onerror = errorcallback;
s.onload = loadcallback;
document.body.appendChild(s);
无论缓存头如何,这个 js 总是重新加载。
任何想法为什么会发生这种情况?
【问题讨论】:
标签: html browser-cache