必须先启用 mod_headers 模块,否则所有 CORS 配置均无效;需取消 httpd.conf 中 LoadModule headers_module modules/mod_headers.so 的注释并彻底重启 Apache,再在 Directory 块中配置 Header set 和 Require method GET POST OPTIONS 等指令。

必须先启用 mod_headers 模块,否则所有 CORS 配置都无效。 这是 90% 的人卡住的第一步——改了 Header set Access-Control-Allow-Origin "*" 却没反应,根本原因不是配置写错了,而是 headers_module 压根没加载。
启用 mod_headers 是硬性前提
打开 X:/xampp/apache/conf/httpd.conf,搜索:LoadModule headers_module modules/mod_headers.so。如果前面有 #,删掉它。XAMPP 默认注释掉这一行,不手动开启,Header 指令在任何地方都会被 Apache 忽略,甚至不报错,只静默失效。
改完必须重启 Apache(不是重载,是彻底 stop → start)。只点“Restart”有时不生效,建议用控制面板明确 stop 再 start。
- 验证是否成功:访问
http://localhost/xampp/phpinfo.php,搜索 “headers”,看到mod_headers在 loaded modules 列表里才算到位 - 别试
.htaccess:XAMPP 默认禁用AllowOverride All,且Header指令不在默认允许覆盖的指令集中,直接放.htaccess会触发 500 错误
在 Directory 块中设置 Header 才可靠
把 CORS 头写进 <directory></directory> 块,而不是虚拟主机或全局配置。推荐改 X:/xampp/apache/conf/extra/httpd-vhosts.conf 或直接在 httpd.conf 末尾追加:
<Directory "X:/xampp/htdocs/myapp">
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET,POST,OPTIONS,PUT,DELETE"
Header set Access-Control-Allow-Headers "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers"
</Directory>
注意路径要和你的项目实际路径一致,Windows 下路径分隔符用正斜杠 / 或双反斜杠 \,单反斜杠会出错。
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
- 开发阶段用
"*"没问题;生产环境必须换为具体域名,如"https://myapp.com" - 如果前端带
credentials: true,Access-Control-Allow-Origin不能是"*",且必须加Header set Access-Control-Allow-Credentials "true" - 不要混用
Header set和Header add:同一 header 名多次set,只有最后一行生效;想允许多个域名,得用add+ 条件判断(较复杂,开发期不建议)
OPTIONS 预检请求常被忽略
浏览器对非简单请求(比如 Content-Type: application/json、自定义 header、PUT/DELETE 方法)会先发一个 OPTIONS 请求探路。Apache 默认不处理 OPTIONS,直接返回 405 Method Not Allowed,导致预检失败,后续请求根本不会发出。
在同一个 <directory></directory> 块里补上这行:
Require method GET POST OPTIONS PUT DELETE
或者更宽松一点(仅限开发):
Require all granted
- 检查有没有
mod_rewrite规则干扰:某些伪静态规则会无差别匹配OPTIONS并重定向或拒掉,加一行RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|OPTIONS)$可规避 - 如果用了 Laravel、WordPress 等框架的 .htaccess,确认它们没覆盖或拦截
OPTIONS—— 最稳妥的方式仍是把 CORS 配置写进 Apache 主配置的<directory></directory>里
缓存和重启陷阱
Apache 不会自动刷新响应头配置,改完不重启 = 白改。但更隐蔽的问题是:浏览器或代理可能缓存了旧的预检响应(OPTIONS 返回的 Access-Control-Allow-* 头),导致你改了配置却看不到效果。
- 测试时清空浏览器缓存,或用隐身窗口 + 禁用缓存(F12 → Network → ✅ Disable cache)
- 重启 Apache 后,仍看到旧错误?试试关掉所有浏览器窗口再重开,或换 Chrome / Edge / Firefox 分别验证
- 极少数情况(尤其 Windows),Apache 服务进程残留,任务管理器里杀掉所有
httpd.exe再启动
真正麻烦的从来不是怎么写那几行 Header set,而是模块没启、方法没放、缓存没清、路径写错——四者占实际问题的绝大多数。

















