必须先启用mod_headers模块,否则Header指令将导致500错误或静默失效;需按系统执行a2enmod headers或取消httpd.conf中LoadModule注释,并用apachectl -M验证,所有Header指令应置于<IfModule mod_headers.c>块内且优先使用always set确保覆盖所有响应状态码。
要让 apache 的 header 指令生效,必须先启用 mod_headers 模块,再按需配置响应头。模块未启用时,任何 header 指令都会导致 500 错误或静默失效。
确认并启用 mod_headers 模块
不同发行版启用方式略有差异,但核心都是加载 mod_headers.so:
-
Debian/Ubuntu 系统:运行
sudo a2enmod headers && sudo systemctl reload apache2 -
RHEL/CentOS/AlmaLinux 系统:编辑
/etc/httpd/conf/httpd.conf,取消注释这行:LoadModule headers_module modules/mod_headers.so,然后执行sudo systemctl reload httpd -
验证是否成功:运行
apachectl -M | grep headers,输出含headers_module (shared)即表示已启用
在配置中安全使用 Header 指令
所有 Header 指令应包裹在 <IfModule mod_headers.c> 块内,避免模块缺失时启动失败:
- 写法示例:
<IfModule mod_headers.c><br> Header always set X-Content-Type-Options "nosniff"<br> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"<br></IfModule>
-
务必用
always set:仅set只作用于 2xx 响应;而安全头(如 CSP、HSTS)必须覆盖 404、500 等错误页,否则存在绕过风险 - 常见操作类型:
–Header unset删除指定头(如Server)
–Header edit正则替换值(如修改Cache-Control中的public为private)
–Header append追加值(如向Vary添加字段)
按资源类型精准控制响应头
避免全局一刀切,推荐结合 <FilesMatch> 或 <Location> 设置差异化策略:
- 静态资源(JS/CSS/图片):
<FilesMatch "\.(js|css|png|jpg|gif|ico)$"><br> Header always set Cache-Control "public, max-age=31536000, immutable"<br></FilesMatch>
- HTML 页面:
<FilesMatch "\.html?$"><br> Header always set Cache-Control "no-cache, must-revalidate"<br></FilesMatch>
- API 接口(如
/api/路径):<Location "/api/"><br> Header always set Cache-Control "no-store"<br> Header always set Content-Security-Policy "default-src 'none'"<br></Location>
检查与验证是否生效
配置完成后不能只看 Apache 启动是否成功,还要实测响应头:
- 用
curl -I https://your-domain.com/path查看返回头,确认目标字段是否存在且值正确 - 对 404 页面也测试一次(如
curl -I https://your-domain.com/404-not-exist),验证always是否真正起效 - 若使用反向代理,注意后端应用可能覆盖 Apache 设置的头——可加
Header always set X-Debug "apache-headers"辅助定位


















