AIStacker
Web

概览

Cache-Control 缓存策略检查

检查 no-store、no-cache、max-age、immutable 与再验证提示是否彼此冲突,避免缓存策略自相矛盾。

分类 hub

Web

问题

5

FAQ

3

Browser and CDN cache policy review

Cache-Control Header Checker

Review whether your Cache-Control strategy is coherent before a single response ends up mixing no-store, no-cache, max-age, immutable, and revalidation hints in contradictory ways.

Header input

Recommended review questions
  • Is this response meant to be non-reusable, revalidated, or aggressively cached for a long time?
  • Is the response personalized, authenticated, or otherwise unsafe for shared caches?
  • Are you mixing static-asset rules such as immutable with page or API rules that should revalidate?
Strategy

Strategy unclear

Issues found
1
ETag
Present
Expires
Missing
Header review
Header looks internally consistent

The directives point in a coherent direction for one cache strategy instead of mixing long-lived asset rules with revalidation or no-store semantics.

可以解决的问题

在实际缓存行为中,no-store 和 no-cache 之间有什么区别?

no-store 告诉缓存不要保留可复用的副本,这适用于高度敏感或一次性的响应。no-cache 通常仍允许存储,但强制在复用前进行重新验证检查,这对于希望保持内容新鲜而又不完全禁掉缓存的场景很有意义。

为什么 max-age 与 no-store 结合通常是可疑的?

正值的 max-age 建议响应在一段时间内是可复用的,而 no-store 则说缓存根本不应该保留可复用的副本。这通常意味着两种不同的缓存策略被复制到了同一个响应头中,现在它们在相互竞争。

为什么在普通 HTML 或 API 响应上使用 immutable 很危险?

immutable 是为通过 URL 区分版本且无需重新检查即可安全保留的内容(如带哈希的静态资源)设计的。在 HTML 或 API 响应上使用 it,可能会导致在相同 URL 下状态发生变化时,无法正常重新验证或刷新内容。

如何在 Cache-Control 中选择 private 和 public?

当响应与单个用户、单个会话或其他不应由共享缓存存储的内容绑定时,使用 private。当响应可以安全地由 CDN 或反向代理等共享中间件复用给多个客户端时,使用 public。

为什么当 ETag 或其他验证器存在时,no-cache 更有意义?

如果响应在复用前必须进行重新验证,像 ETag 这样的验证器为客户端和中间件提供了一个具体的方法来询问存储的副本是否仍然是当前最新的。如果没有验证器,团队往往期望有优雅的重新验证行为,但实际操作中往往会导致更模糊的缓存处理。

典型使用流程

该工作流相关指南

Supporting guides that connect this tool to the broader category workflow.

打开分类 hub

是什么

Cache-Control 缓存策略检查 是什么

缓存控制 (Cache-Control) 响应头检查工具可以帮助您回答一个细微但重要的问题:这些指令是否真的描述了一个一致的缓存策略,还是只是从不同地方复制来的、彼此冲突的代码片段?团队经常发布像 `no-store, max-age=3600` 或 `immutable, no-cache` 这样的响应头,却没意识到它们结合了完全不同的缓存模型规则。

这种混乱通常不会表现为明显的语法错误。它会在以后表现为陈旧的 HTML、过度缓存的 API 响应、混乱的 CDN 行为,或者在支持服务单中大家为缓存本应如何工作而争论不休。检查器的作用在于将这些混合信号转化为一组更精简、更易于审查的策略决策。

如何使用

如何使用Cache-Control 缓存策略检查

粘贴您准备发布的 `Cache-Control` 值,如果您的响应还返回了 `ETag` 和 `Expires`,也可以选择性地包含它们。添加关于使用场景的简短说明,例如经过身份验证的 HTML、公共 API JSON 或带版本的静态资源。

检查器会突出显示您的指令是否指向一个一致的策略:不复用、带验证的存储或长效不可变复用。当 `private`、`public`、`no-store`、`max-age` 和 `immutable` 等指令相互冲突时,它也会发出警告。

使用示例

使用示例

示例:
使用场景: 带版本的 JS 资源
Cache-Control: public, max-age=31536000, immutable
ETag: 
Expires: 

结果:
该响应头指向一个一致的长效资源策略。这适用于带有哈希值的文件,这些文件可以保持缓存而无需重新验证。

常见使用场景

常见使用场景

1. 审查 HTML 响应应该是重新验证还是完全避免缓存。

2. 检查静态资源响应头对于长效不可变 (immutable) 复用是否真的安全。

3. 发现 API 响应中是否意外混合了从不同示例中复制的 no-store 和 max-age。

4. 在部署前对比面向浏览器的缓存规则与面向 CDN 的缓存预期。

常见问题

常见问题

no-store 和 no-cache 之间的实际区别是什么?v
no-store 意味着缓存根本不应该保留可复用的副本。no-cache 通常意味着可以存储响应,但在复用之前必须进行重新验证 (Revalidation)。团队经常混淆它们,因为两者听起来都很严格,但它们支持的运行行为完全不同。
immutable(不可变)在什么时候真正有意义?v
immutable 对于 URL 随内容更改而更改的“带版本资源”最有用。它通常不适合需要新鲜度验证的 HTML 或 API 响应,因为 immutable 告诉客户端在复用窗口内不要去检查更新。
如果我已经使用了 Cache-Control,还需要 Expires 吗?v
现代客户端主要遵循 Cache-Control,因此 Expires 通常是次要的。您仍可以出于兼容性或基础设施原因保留它,但它不应与主要的 Cache-Control 策略相矛盾。