php如何实现跨域资源共享cors全方案_php不同请求类型预检与实际响应头设置

絕刀狂花
发布: 2025-11-28 21:08:02
原创
430人浏览过
使用PHP处理跨域请求需设置CORS响应头,允许指定源、方法和请求头;2. 需正确响应OPTIONS预检请求并退出脚本;3. 生产环境应校验Origin白名单并支持凭证时禁用通配符;4. 可结合请求类型动态调整响应头以提升安全与性能。

php如何实现跨域资源共享cors全方案_php不同请求类型预检与实际响应头设置

在使用 PHP 开发 Web API 时,前端跨域请求是常见问题。浏览器出于安全考虑实施同源策略,限制了不同源之间的资源请求。CORS(Cross-Origin Resource Sharing)是 W3C 标准解决方案,通过设置 HTTP 响应头来允许跨域访问。PHP 可以灵活控制响应头,实现完整的 CORS 支持。

基础 CORS 响应头设置

最简单的跨域支持是对所有来源开放读取权限。适用于公开接口,但需注意安全性:

示例代码:

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
?>
登录后复制

说明:

立即学习PHP免费学习笔记(深入)”;

  • Access-Control-Allow-Origin:指定允许的源。设为 * 表示接受所有域,若需身份验证(如携带 Cookie),则不能使用通配符,必须明确指定域名,例如 https://example.com
  • Access-Control-Allow-Methods:列出允许的 HTTP 方法。
  • Access-Control-Allow-Headers:声明客户端允许发送的自定义请求头,如 AuthorizationX-Requested-With 等。

处理预检请求(Preflight Request)

某些请求会触发浏览器发送 OPTIONS 预检请求,判断服务器是否允许实际请求。这类请求包括:

  • 非简单方法(如 PUT、DELETE、PATCH)
  • 携带自定义请求头(如 Authorization
  • Content-Type 不是以下之一:text/plainapplication/x-www-form-urlencodedmultipart/form-data

服务器必须正确响应 OPTIONS 请求,否则实际请求不会发出。

完整预检处理逻辑:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    // 返回预检响应并立即终止脚本
    header("Access-Control-Allow-Origin: https://your-frontend.com");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS");
    header("Access-Control-Allow-Headers: Content-Type, Authorization, X-API-Key");
    header("Access-Control-Max-Age: 86400"); // 缓存预检结果24小时
    exit; // 预检请求无需继续执行后续逻辑
}
?>
登录后复制

关键点:

Kits AI
Kits AI

Kits.ai 是一个为音乐家提供一站式AI音乐创作解决方案的网站,提供AI语音生成和免费AI语音训练

Kits AI 492
查看详情 Kits AI
  • 必须检查 REQUEST_METHOD 是否为 OPTIONS
  • Access-Control-Max-Age 减少重复预检请求,提升性能。
  • 确保 exit; 阻止主业务逻辑执行。

动态允许来源与凭证支持

生产环境通常需要限制特定来源,并支持用户凭证(如 Cookie 或 Authorization 头)。

安全做法:白名单校验来源

<?php
$allowedOrigins = [
    'https://example.com',
    'https://admin.example.com',
    'http://localhost:3000'
];

$origin = $_SERVER['HTTP_ORIGIN'] ?? '';

if (in_array($origin, $allowedOrigins)) {
    header("Access-Control-Allow-Origin: $origin");
    header("Access-Control-Allow-Credentials: true"); // 允许携带凭证
}

// 其他 CORS 头
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-API-Key");
?>
登录后复制

说明:

立即学习PHP免费学习笔记(深入)”;

  • 只有匹配白名单的 Origin 才返回对应头,避免通配符与凭证共用导致的安全错误。
  • Access-Control-Allow-Credentials: true 允许前端设置 withCredentials = true 发送 Cookie。
  • 前端请求也必须设置 credentials: 'include'(fetch)或 withCredentials: true(XMLHttpRequest)。

根据不同请求类型调整响应

可结合请求方法和内容类型做差异化处理:

<?php
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
$method = $_SERVER['REQUEST_METHOD'];

// 定义合法来源
$trusted = ['https://a.com', 'https://b.com'];

if (in_array($origin, $trusted)) {
    header("Access-Control-Allow-Origin: $origin");
    
    if ($method === 'OPTIONS') {
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
        header("Access-Control-Allow-Headers: Content-Type, Authorization");
        header("Access-Control-Max-Age: 600");
        exit;
    }
}

// 实际请求处理(如 POST)
if ($method === 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    // 处理业务逻辑...
    echo json_encode(['status' => 'success']);
}
?>
登录后复制

常见注意事项:

  • 始终验证 Origin,防止反射式 XSS 风险。
  • 敏感接口不要随意开启 Allow-Credentials
  • 调试时可用浏览器开发者工具查看“网络”选项卡中的请求头,确认预检是否成功。
  • Nginx/Apache 也可配置 CORS,但 PHP 层更灵活,适合动态控制。

基本上就这些。掌握预检机制与响应头组合,就能应对各种跨域场景。不复杂但容易忽略细节。

以上就是php如何实现跨域资源共享cors全方案_php不同请求类型预检与实际响应头设置的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号