强缓存默认时间

HTTP 强缓存在未设置过期时间时的默认行为

问题

当服务器没有设置 Cache-ControlExpires 时,浏览器的默认强缓存时间是多少?

解答

没有固定的默认值。浏览器会使用**启发式缓存(Heuristic Caching)**来计算缓存时间。

计算公式

缓存时间 = (Date - Last-Modified) × 10%

即:资源最后修改时间距今越久,缓存时间越长。

示例

HTTP/1.1 200 OK
Date: Mon, 01 Jan 2024 00:00:00 GMT
Last-Modified: Mon, 01 Jan 2023 00:00:00 GMT
Content-Type: text/html
// 计算启发式缓存时间
const date = new Date('2024-01-01').getTime();
const lastModified = new Date('2023-01-01').getTime();

// 资源"年龄":365 天
const age = date - lastModified;

// 缓存时间:365 × 10% = 36.5 天
const cacheTime = age * 0.1;

console.log(cacheTime / (1000 * 60 * 60 * 24)); // 36.5 天

显式设置缓存时间

# 推荐:明确设置缓存策略
Cache-Control: max-age=31536000

# 或设置过期时间
Expires: Wed, 01 Jan 2025 00:00:00 GMT

关键点

  • Cache-ControlExpires 时,浏览器使用启发式缓存
  • 计算公式:(Date - Last-Modified) × 10%
  • 必须有 Last-Modified 头才能计算,否则可能不缓存
  • 不同浏览器实现可能略有差异(10% 是 RFC 建议值)
  • 生产环境应显式设置 Cache-Control,避免依赖默认行为