Apache中启用mod_headers模块是使用Header指令的前提,需在httpd.conf中取消#LoadModule headers_module行的注释并确保路径正确;CSP必须用Header always set以覆盖所有响应状态码,且应配置于主配置文件而非.htaccess或<VirtualHost>内。

phpEnv 里 Apache 的 mod_headers 模块默认没启用
phpEnv 是 Windows 下的集成环境,Apache 默认不加载 mod_headers,所以直接写 Header set Content-Security-Policy 会报错或完全不生效。必须手动启用模块,且路径依赖 phpEnv 的实际安装结构。
常见错误现象:Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration
- 打开 phpEnv 安装目录下的
Apache\conf\httpd.conf - 搜索
#LoadModule headers_module,去掉行首的#(注意路径是否匹配,比如可能是modules/mod_headers.so或libexec/mod_headers.so) - 确认该行未被注释且路径存在(若报错找不到文件,说明 phpEnv 版本精简掉了该模块,需换完整版 Apache 或改用其他方式注入头)
Content-Security-Policy 必须用 Header always set,不能只用 Header set
phpEnv 常代理 PHP-FPM 或 CGI,Header set 在 500、404 等错误响应中不会生效,而 CSP 需要覆盖所有响应——尤其错误页常被 XSS 利用。用 always 才能确保策略始终强制执行。
-
Header set Content-Security-Policy→ 只在 2xx 响应中设置,错误页裸奔 -
Header always set Content-Security-Policy→ 所有状态码都生效,包括 404、500、301 - 若同时配置了全局和虚拟主机,且想覆盖旧值,先
Header unset Content-Security-Policy再Header always set
phpEnv 的 Apache 配置作用域容易错位:别往 .htaccess 里写 CSP
phpEnv 默认禁用 AllowOverride All,.htaccess 文件基本无效;即使开了,CSP 也不能靠它全局生效——重定向响应(如 HTTP→HTTPS)、静态资源、错误页都不走 .htaccess,策略会漏掉关键入口。
立即学习“PHP免费学习笔记(深入)”;
- 必须把 CSP 配置写进主配置文件:
Apache\conf\httpd.conf底部,或新建Apache\conf\extra\security-headers.conf并用Include conf/extra/security-headers.conf加载 - 不要放在
<VirtualHost>内部——除非你明确只要某个站点生效;全局防护必须放外部 - 若用 phpEnv 的“站点管理”界面生成配置,检查它是否把你的 CSP 插入到了
<VirtualHost>里,这种写法对多站点不安全
本地开发时 CSP 的 localhost 和端口问题最常导致白屏
在 phpEnv 中本地跑 http://localhost:8080,如果 CSP 写成 default-src 'self',浏览器会严格按协议+域名+端口校验,'self' 只匹配 http://localhost:8080,但内联脚本、CSS、XHR 请求稍有偏差就全被拦。
- 开发阶段建议放宽:
Header always set Content-Security-Policy "default-src 'self' http://localhost:*; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'" - 切勿在生产环境保留
'unsafe-inline'或'unsafe-eval',上线前必须用 nonce 或 hash 替代 - 验证是否生效:打开 Chrome DevTools → Network → 刷新页面 → 看响应头里是否有
Content-Security-Policy字段,且内容与配置一致



















