有哪些常见的HTTP响应头误区
参考资料
有哪些常见的HTTP响应头误区
Cache-Control: no-cache 表示不缓存
误区:很多人认为
no-cache
表示完全不缓存。事实:
no-cache
允许缓存,但要求每次使用前必须向服务器验证(发送If-None-Match
或If-Modified-Since
请求)。真正禁止缓存的是no-store
。混淆 Expires 和 Cache-Control 优先级
误区:认为
Expires
和Cache-Control
同时存在时,Expires
优先级更高。事实:
Cache-Control
的max-age
优先级高于Expires
,现代浏览器主要依赖Cache-Control
。错误使用 Vary 头导致缓存失效
误区:随意设置
Vary: *
或过多字段(如Vary: User-Agent
),以为能提高缓存灵活性。事实:
Vary
头会严格匹配请求头,过度使用可能导致缓存命中率极低,甚至完全失效。认为 ETag 比 Last-Modified 更高效
误区:认为
ETag
(基于内容哈希)一定优于Last-Modified
(基于时间)。事实:
ETag
计算可能消耗资源(如动态生成),而Last-Modified
对静态文件更简单高效。忽略 Age 头的存在
误区:未注意代理服务器返回的
Age
头,误判资源新鲜度。事实:
Age
表示资源在代理缓存中的存储时间,需结合max-age
计算剩余缓存时间。错误设置 Pragma: no-cache
误区:认为
Pragma: no-cache
是 HTTP/1.1 的推荐缓存控制方式。事实:
Pragma
是 HTTP/1.0 的遗留字段,现代应用应优先使用Cache-Control
。认为 Set-Cookie 会阻止所有缓存
误区:认为响应包含
Set-Cookie
时浏览器一定不缓存。事实:除非显式设置
Cache-Control: private
或no-store
,否则可能被缓存(但通常不建议)。忽略 Content-Length 的重要性
误区:动态内容忽略
Content-Length
,依赖分块传输(Transfer-Encoding: chunked
)。事实:明确
Content-Length
可提升性能(如支持持久连接),尤其对静态资源。错误理解 Transfer-Encoding: chunked
误区:认为分块传输(
chunked
)仅用于流式响应。事实:它是 HTTP/1.1 的默认机制,在未知内容大小时必须使用,但会增加解析开销。
认为所有 3xx 响应都需要 Location 头
误区:认为
301
/302
之外的 3xx 状态码(如304 Not Modified
)也需要Location
。事实:仅重定向类状态码(如
301
、302
、307
等)需要Location
,304
不需要。