PHP不直接处理OPTIONS请求,而是通过设置CORS响应头(如Access-Control-Allow-Origin、Methods、Headers等)使浏览器允许跨域请求;需在入口文件拦截OPTIONS并返回200或204,且Access-Control-Allow-Origin不能为*当启用credentials。

PHP本身不直接处理JavaScript发起的OPTIONS请求,因为这类请求通常由浏览器在跨域(CORS)场景下自动发出,用于预检(preflight)。关键不是“让PHP响应OPTIONS”,而是确保服务器正确返回CORS响应头,使浏览器允许后续的实际请求(如POST、PUT等)。
理解为什么会出现OPTIONS请求
当JS使用fetch或XMLHttpRequest发起跨域请求,且满足以下任一条件时,浏览器会先发一个OPTIONS预检请求:
- 请求方法不是GET、HEAD、POST
- 设置了自定义请求头(如Authorization、X-Requested-With)
- Content-Type不是application/x-www-form-urlencoded、multipart/form-data或text/plain
在PHP中正确响应OPTIONS请求
你不需要专门写逻辑处理OPTIONS的业务逻辑,只需在入口文件(如index.php或API路由顶端)添加响应头,并对OPTIONS请求快速返回200。示例:
// 检查是否为OPTIONS请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
// 设置CORS响应头
header('Access-Control-Allow-Origin: https://your-frontend-domain.com');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
// 告诉浏览器这个预检结果可缓存一天
exit(0);
}注意:Access-Control-Allow-Origin不能设为*同时启用Access-Control-Allow-Credentials: true,否则浏览器会拒绝。需明确指定前端域名。
立即学习“PHP免费学习笔记(深入)”;
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
统一处理所有请求的CORS头(推荐)
更稳妥的做法是:无论什么请求方法,都先输出基础CORS头;再对OPTIONS单独拦截并退出。这样避免遗漏:
// 所有请求都设置基础CORS头
header('Access-Control-Allow-Origin: https://your-frontend-domain.com');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
<p>// 单独处理OPTIONS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
exit(0);
}</p><p>// 后续继续执行你的正常逻辑(如解析JSON、调用API等)配合Web服务器(Nginx/Apache)更高效
如果使用Nginx,建议把CORS和OPTIONS拦截交给服务器层处理,减少PHP执行开销:
location /api/ {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Max-Age "86400";
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
<pre class="brush:php;toolbar:false;">add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
add_header Access-Control-Allow-Credentials "true";
# 其他PHP转发配置...}
Apache可用mod_headers和mod_rewrite实现类似逻辑。


















