apache 通过 mod_headers 模块在反向代理响应发往客户端前拦截并重写响应头;需启用该模块、在 proxypass 后的 location/proxy/virtualhost 块中配置 header 指令,并可按内容类型、状态码或环境变量条件化操作。

Apache 本身不修改后端响应头,真正起作用的是 mod_headers 模块,配合反向代理(mod_proxy)使用。关键不是“让 Apache 替后端发头”,而是“在响应发给客户端前,拦截并重写它”。
必须启用 mod_headers 模块
没有这个模块,所有 Header 操作指令都会被忽略。
- 确认已加载:
LoadModule headers_module modules/mod_headers.so
- Debian/Ubuntu 可运行:
a2enmod headers - RHEL/CentOS 检查
httpd.conf或/etc/httpd/conf.modules.d/下对应文件 - 启用后重启 Apache:
systemctl restart apache2或apachectl restart
在代理路径内配置 Header 操作
Header 指令需放在 <location></location>、<proxy></proxy> 或 <virtualhost></virtualhost> 块中,且必须位于 ProxyPass 之后,才能生效。
常见操作示例:
-
删除后端暴露的敏感头:
Header unset Server Header unset X-Powered-By
-
强制设置安全头(对所有响应生效):
Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "DENY" Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
-
补充协商头(尤其启用压缩时必需):
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
Header append Vary "Accept-Encoding"
-
清理与压缩冲突的头(若启用
mod_deflate):Header unset Content-Encoding Header unset Content-Length
⚠️ 注意:
Header set会覆盖后端同名头;Header unset会先清除再设新值;always修饰符确保 3xx/4xx/5xx 响应也生效。
按内容类型或状态码做条件处理
只对特定响应改头,避免误操作:
-
仅对 JSON 响应强制声明字符集:
<if m> Header set Content-Type "application/json; charset=utf-8" </if>
-
或通过环境变量标记后处理:
SetEnvIf Request_URI "\.api$" is_api Header set X-API-Version "v2" env=is_api
避免与后端逻辑冲突
- Spring Boot、Express、Django 等框架常自带 Header 管理。建议:
- 后端专注业务头(如
X-Request-ID、X-Correlation-ID) - 安全头、CORS 头、压缩协商头统一由 Apache 注入
- 后端专注业务头(如
- 若后端已设
Access-Control-Allow-Origin,而你想覆盖,直接Header set即可 - 切勿同时在后端和 Apache 层启用 gzip —— 会导致双重压缩错误
不复杂但容易忽略










