为什么.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
相关产品推荐
相关产品推荐

