我有一个主要由 CDN 提供的静态 HTML 网站(加上一些 AJAX 到服务器),并且希望用户的浏览器缓存所有内容,直到我更新任何文件然后我希望用户的浏览器获得新版本.
对于我网站上的所有类型的静态文件(HTML、JS、CSS、图像等),我该如何实现这一点? (HTML 或其他地方的设置)。显然,我可以告诉 CDN 使其缓存过期,所以这是我正在考虑的客户端。
谢谢。
最佳答案
实现此目的的一种方法是使用 HTTP Last-Modified
或 ETag
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-Since
和 If-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
请注意,只有两种机制(ETag
或 Last-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/