phpEnv中Apache默认未启用mod_headers模块,需手动在httpd.conf中取消LoadModule headers_module modules/mod_headers.so注释并重启服务,否则所有CORS配置均无效。

phpEnv 中 Apache 默认不启用 mod_headers,不手动开启就根本没法配 CORS —— 这是 90% 跨域失败的真正起点。
确认 phpEnv 的 Apache 是否已加载 mod_headers
phpEnv 是 Windows 下的集成环境,Apache 配置路径通常为:C:\phpEnv\apache\conf\httpd.conf(具体以你安装路径为准)。打开该文件,搜索:
LoadModule headers_module modules/mod_headers.so
如果这行被注释(开头有 #)或压根不存在,Header 指令就完全无效,后续所有配置都是白写。
- 没这行?手动添加到
LoadModule区块末尾 - 有但带
#?删掉#解除注释 - 改完必须重启 phpEnv 的 Apache 服务(不是只点“重启”,要确保进程真正重载)
Header always set 必须用在 <Directory> 或 <VirtualHost> 块里
不能直接写在 httpd.conf 全局作用域,否则会报错 Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration。
立即学习“PHP免费学习笔记(深入)”;
推荐写法(替换为你的真实网站路径):
<Directory "C:/phpEnv/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
<IfModule mod_headers.c>
Header always set Access-Control-Allow-Origin "http://localhost:3000"
Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header always set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Max-Age "86400"
</IfModule>
</Directory>
-
Access-Control-Allow-Origin不能和Access-Control-Allow-Credentials: true同时设为*,否则浏览器直接拒绝;开发用http://localhost:3000这类明确地址更稳妥 -
Header always set比Header set多一层保险——确保 OPTIONS 预检请求也能带上头 -
Access-Control-Allow-Headers必须包含前端实际发的自定义头,比如X-Auth-Token或RIDER-APPKEY,漏一个,预检就 403
必须显式放行 OPTIONS 请求,否则预检卡死
只要前端用了 Authorization、Content-Type: application/json 或任何自定义 header,浏览器必先发 OPTIONS。phpEnv 的 Apache 默认不响应它,请求就 hang 在 pending 状态。
最简解法:在同一个 <Directory> 块里加一行 Require all granted(上面示例已包含),它让 OPTIONS 不被访问控制拦截;如果仍不行,补上重写规则:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
- 这段要放在
<Directory>内,且确保mod_rewrite已启用(phpEnv 一般默认开) - 别信“我只用 GET,不用管 OPTIONS”——加个
fetch(..., { headers: { 'X-Trace': '1' } })就触发预检
别用 .htaccess,phpEnv 下大概率失效
phpEnv 的 Apache 主配置中,AllowOverride 默认是 None,意味着 .htaccess 文件里的 Header 指令会被忽略,且不会报错,只会静默失效。
- 想验证是否生效?用
curl -I -X OPTIONS http://localhost/api/test看响应头有没有Access-Control-Allow-Origin - Windows 下重启 Apache 后,建议用任务管理器确认
httpd.exe进程是否已更新(旧进程残留会导致配置不生效) - 生产环境务必把
Access-Control-Allow-Origin换成具体域名,*+credentials组合在现代浏览器下直接被拒



















