移动体验 / 方法解读

移动端个性化内容缓存失效?检查 Cache-Control: private 指令

当移动端用户看到其他人的个性化内容时,通常是因为服务器未正确区分私有缓存与共享缓存。

展示HTTP响应头中Cache-Control: private指令的代码片段或技术文档截图
主题资料配图,非新闻现场照片 · 配图:当指定 private 指令后,响应只以特定的用户作为对象,这与 public

为什么会出现内容错乱

HTTP 缓存分为私有缓存和共享缓存。私有缓存通常绑定在特定客户端,如浏览器缓存,可以存储个性化内容。共享缓存位于客户端和服务器之间,可以存储可共享的响应。如果响应包含个性化内容且被存储在共享缓存中,其他用户可能会检索到这些内容,导致信息泄露。因此,必须指定私有指令来确保响应仅存储在私有缓存中。

个性化内容通常由 Cookie 控制,但存在 Cookie 并不总是意味着响应是私有的。因此,不能仅凭 Cookie 判断是否需要私有缓存。必须明确使用 Cache-Control: private 指令来指示缓存行为,防止个性化内容被错误地共享。

如何排查缓存设置

检查服务器返回的响应头是否包含 Cache-Control: private 指令。如果响应包含个性化内容,但未指定该指令,则可能导致内容被共享缓存存储。使用网络抓包工具查看响应头,确认指令是否存在。

如果响应包含个性化内容,但未指定 Cache-Control: private,则应添加该指令。确保服务器在生成响应时根据内容类型和用户身份正确设置缓存头。对于需要个性化的页面,始终使用 private 指令。

验证缓存隔离效果

在移动端浏览器中清除缓存,然后访问包含个性化内容的页面。检查网络请求,确认响应头包含 Cache-Control: private。随后,使用不同的用户身份或清除 Cookie 后再次访问,验证是否仍能获取到正确的个性化内容。

如果响应头包含 Cache-Control: private,但仍然出现内容错乱,可能是共享缓存(如代理或 CDN)未正确遵循该指令。检查代理或 CDN 的配置,确保它们支持私有缓存指令,并正确隔离不同用户的缓存内容。

避免常见配置错误

不要仅依赖 Cookie 来区分私有和共享缓存。Cookie 的存在并不自动使响应变为私有。必须明确使用 Cache-Control: private 指令来指示缓存行为,防止个性化内容被错误地共享。

避免使用过时的缓存头组合,如 Cache-Control: no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate。这些头组合旨在解决旧版代理缓存实现的问题,但在现代 HTTPS 环境中通常不需要。应优先使用 Cache-Control: private 来明确缓存策略。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. HTTP caching - HTTP | MDN ↗
  2. 配图:当指定 private 指令后,响应只以特定的用户作为对象,这与 public ↗
← 更多移动体验文章返回顶部 ↑