File Caching: Query String vs Last-Modified?

在前端开发中,文件缓存是提高页面性能的关键之一。但是,在选择如何缓存静态资源时,有两种主要的方法:使用查询字符串和使用Last-Modified头。本文将比较这两种方法的优缺点并为您提供指导意见。

查询字符串

使用查询字符串作为版本控制的方式非常常见。在请求URL后添加一个字符串,通常是一个版本号或者时间戳,如果文件内容被更新,则查询字符串也应该被更新。例如:

----- ---------------- ------------------------

styles.css被更新时,只需要更改查询字符串的值即可强制浏览器重新获取文件。这种方法不会影响缓存机制,并且可以确保用户始终使用最新版本的文件。另外,因为浏览器会将不同查询串视为不同的文件,所以即使文件名没有变化,浏览器仍然可以检测到文件已经被更新。

优点

  • 可以轻松地启用和禁用缓存。
  • 对于CDN和负载均衡来说,它是一种简单易行的方式。
  • 可以确保用户始终使用最新版本的文件。

缺点

  • URL地址会随着每个版本的变化而变化,可能会影响SEO。
  • 如果文件名没有变化,浏览器可能不会重新获取文件,因为它仅检测查询字符串的更改。

Last-Modified头

另一种控制缓存的方法是使用Last-Modified头。服务器在响应文件请求时会返回一个时间戳(通常是文件最近修改时间),浏览器会将这个时间戳存储在本地,并在后续请求中将该时间戳发送回服务器,以判断文件是否已被修改。例如:

-------- --- --
------------- --------
-------------- ---- -- --- ---- -------- ---

如果styles.css再次被请求,浏览器会发送一个包含Last-Modified头的条件GET请求:

--- ----------- --------
------------------ ---- -- --- ---- -------- ---

如果文件未被修改,则服务器将返回一个304 Not Modified响应,浏览器将从缓存中加载文件。

优点

  • URL地址不会随着每个版本的变化而变化,对SEO友好。
  • 文件名没有变化时,浏览器可以自动检测到文件已被更新。
  • 减少了网络流量。

缺点

  • 服务器必须支持Last-Modified头才能正常工作。
  • 时间戳精度有限,无法检测某些类型的文件更改,例如只更改文件注释的情况。

建议

综上所述,当您需要在更新静态资源时避免重新加载任何缓存时,请使用查询字符串。但是,如果您不希望每次更改版本号都会影响URL地址,则使用Last-Modified头是更好的选择。

最佳实践是结合两者:使用查询字符串来控制缓存并且为了SEO友好,使用Last-Modified头来检测文件是否被修改。例如:

----- ---------------- ----------------------- ---------------------------

示例代码

查询字符串

--------- -----
----- ----------
------
  ----- ----------------
  ------------ ------ ---------------
  ----- ---------------- ------------------------
-------
------
  ---

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------