javascript - 我应该在我的 HTML 中放入什么来确保用户获得我页面的最新版本,而不是旧版本?

标签 javascript html browser-cache cache-control

我有一个主要由 CDN 提供的静态 HTML 网站(加上一些 AJAX 到服务器),并且希望用户的浏览器缓存所有内容,直到我更新任何文件然后我希望用户的浏览器获得新版本.

对于我网站上的所有类型的静态文件(HTML、JS、CSS、图像等),我该如何实现这一点? (HTML 或其他地方的设置)。显然,我可以告诉 CDN 使其缓存过期,所以这是我正在考虑的客户端。

谢谢。

最佳答案

实现此目的的一种方法是使用 HTTP Last-ModifiedETag header 。在服务文件的 HTTP header 中,服务器将发送页面最后修改的日期(在 Last-Modified header 中),或代表页面当前状态的随机 ID( ETag),或两者兼而有之:

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Fri, 18 Dec 2015 08:24:52 GMT
ETag: "208f11-52727df9c7751"
Cache-Control: must-revalidate

如果 header Cache-Control 设置为 must-revalidate,它会导致浏览器缓存页面以及 Last-Modified 和它收到的 ETag header 。在下一个请求中,它会将它们作为 If-Modified-SinceIf-None-Match 发送:

GET / HTTP/1.1
Host: example.com
If-None-Match: "208f11-52727df9c7751"
If-Modified-Since: Fri, 18 Dec 2015 08:24:52 GMT

如果页面的当前 ETag 与来自浏览器的那个相匹配,或者如果页面自浏览器发送之日起没有被修改,而不是发送页面,服务器将发送一个带有空主体的 Not Modified header :

HTTP/1.1 304 Not Modified

请注意,只有两种机制(ETagLast-Modified)中的一种是必需的,它们都可以独立工作。

这样做的缺点是无论如何都必须发送请求,因此性能优势主要针对包含大量数据的页面,但特别是在具有高延迟的互联网连接上,页面仍然需要很长时间加载。 (不过它肯定会减少您的流量。)

Apache 自动 generates an ETag (使用文件的 inode 编号、修改时间和大小)和静态文件的 Last-Modified header (基于文件的修改时间)。我不知道其他网络服务器,但我认为它会类似。对于动态页面,您可以自己设置 header (例如,将内容的 MD5 和作为 ETag 发送)。

默认情况下,Apache 不发送 Cache-Control header (默认为 Cache-Control: private)。此示例 .htaccess 文件使 Apache 发送所有 .html 文件的 header :

<FilesMatch "\.html$">
    Header set Cache-Control "must-revalidate"
</FilesMatch>

另一种机制是通过发送 Cache-Control: public 让浏览器缓存页面,但动态改变 URL,例如通过将文件的修改时间附加为查询字符串(?12345)。这只有在您的页面/文件仅从您的 Web 应用程序内部链接时才有可能,在这种情况下,您可以动态生成指向它的链接。例如,在 PHP 中你可以这样做:

<script src="script.js?<?php echo filemtime("script.js"); ?>"></script>

关于javascript - 我应该在我的 HTML 中放入什么来确保用户获得我页面的最新版本,而不是旧版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445358/

相关文章:

javascript - JS : Callback function is not executing

html - 在所有其他内容后面放置一个文档长度和宽度 div

javascript - 持续滚动图像

在 Grails 中缓存?

javascript - 将来自 API 的数据与 Chart JS 一起使用

javascript - JSON.parse 转换为字符串而不是传入数组

html - 将 div 定位在表格底部

http - If-Modified-Since 在浏览器中覆盖 If-None-Match

browser-cache - 如何利用 .woff 字体的浏览器缓存?

Javascript SetTimeout 变量访问