apache需在rewrite阶段截断options请求并返回204,同时用header always设置cors头,禁用php层预检响应,确保mod_headers和mod_rewrite已启用且配置后重启apache。

phpEnv 是 Windows 下的集成环境,Apache 默认不拦截 OPTIONS 请求,直接透传给 PHP 脚本——这会导致预检变慢、重复触发、甚至被 PHP 框架错误处理(比如返回 404 或 500)。必须在 Apache 层面截断 OPTIONS 并返回 204,同时补全 CORS 头。
确认 mod_headers 和 mod_rewrite 已启用
phpEnv 的 Apache 配置通常位于 phpEnv\Apache\conf\httpd.conf。打开后检查两行是否取消注释:
LoadModule headers_module modules/mod_headers.soLoadModule rewrite_module modules/mod_rewrite.so
如果被 # 注释,删掉它;改完必须重启 Apache(通过 phpEnv 控制面板点“重启 Apache”),否则配置完全不生效。
在 VirtualHost 或 Directory 块中添加预检拦截规则
不要写在 .htaccess 里——phpEnv 默认禁用 AllowOverride,且 .htaccess 对 OPTIONS 请求无效。直接编辑虚拟主机配置(如 phpEnv\Apache\conf\vhost\localhost.conf),在 <virtualhost></virtualhost> 内插入:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ - [R=204,L]
关键点:
-
-表示不重写路径,避免误跳转 -
R=204强制返回空响应体,比R=200更符合规范,且不会触发浏览器缓存逻辑干扰 -
L确保立即终止规则链,防止后续规则干扰
Header 指令必须加 always 才对 OPTIONS 生效
普通 Header set 只作用于有响应体的请求(如 PHP 输出的 200),而 204 响应不经过内容输出阶段,头会被跳过。正确写法是:
<ifmodule mod_headers.c>
Header always set Access-Control-Allow-Origin "http://localhost:8080"
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"
</ifmodule>
注意:
- 若设
Access-Control-Allow-Credentials: true,Access-Control-Allow-Origin不能为*,必须写具体前端地址 -
Access-Control-Allow-Headers要覆盖前端实际发送的所有自定义头,比如 Vue 项目常带X-Requested-With,漏掉就会预检失败 - 所有
Header行都必须带always,否则 OPTIONS 响应里根本看不到这些头
关掉 PHP 框架的预检自动响应
如果你用的是 Laravel、ThinkPHP 或自写 PHP 路由,它们可能在入口脚本或中间件里对 OPTIONS 请求做了响应(比如 echo 一个空字符串或返回 200)。这和 Apache 的 204 冲突,导致响应头混乱或状态码错乱。
检查你的 PHP 入口文件(如 public/index.php)或中间件,移除或注释掉类似这样的代码:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
Apache 已经处理了 OPTIONS,PHP 层再碰它,只会增加不可控变量。上线前务必用 curl -I -X OPTIONS http://localhost/api/user 验证:状态码是 204,且只含你 Apache 显式设置的 CORS 头——没有 PHP 输出的额外头,也没有重复头。
真正容易被忽略的是:Header always 的 always 不能省,以及 phpEnv 的 httpd.conf 修改后必须点控制面板里的“重启 Apache”,光保存文件没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











