You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么.htaccess中Header set指令没有覆盖已存在的响应头?

问题原因

出现双Cache-Control响应头的核心原因是Apache mod_headers 模块的响应头表分区机制:

  • Apache默认将响应头分为两个独立的存储表:onsuccess 表和 always 表
  • onsuccess 表仅存储200~399状态码正常响应的头信息,Header 指令不加参数时默认操作的就是这个表
  • 404属于4xx错误类响应,对应的响应头默认存储在always表中

你当前的配置没有指定操作always表,所以仅在onsuccess表中添加了Cache-Control头,而404响应本身在always表中还有系统默认生成/其他规则设置的Cache-Control头,两个表的头会在最终响应中合并返回,就出现了重复的同名头。
如果你的站点配置了自定义404错误页,自定义页面本身输出的Cache-Control头也会写入always表,进一步加剧该问题。

修复方案

给所有404相关的Header指令加上always参数,指定操作错误响应对应的头表即可:

#  Set Cache-Control, CDN-Cache-Control and Cloudflare-CDN-Cache-Control for 404 not found error
Header always set Cache-Control "max-age=180, must-revalidate" "expr=%{REQUEST_STATUS} == 404"
Header always set CDN-Cache-Control "max-age=180, must-revalidate" "expr=%{REQUEST_STATUS} == 404"
Header always set Cloudflare-CDN-Cache-Control "max-age=180, must-revalidate" "expr=%{REQUEST_STATUS} == 404"

内容的提问来源于stack exchange,提问作者alancc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:54:03