当前位置:首页 > PHP

php实现跨域请求

2026-02-27 19:57:49PHP

跨域请求的基本概念

跨域请求是指浏览器出于安全考虑,限制从一个源(协议、域名、端口)发起的请求访问另一个源的资源。PHP作为服务器端语言,可以通过设置响应头或代理请求实现跨域。

设置响应头允许跨域

在PHP中,通过设置Access-Control-Allow-Origin等HTTP头实现跨域。以下是一个简单示例:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
  • Access-Control-Allow-Origin: *允许所有域访问,也可以指定具体域名如https://example.com
  • Access-Control-Allow-Methods定义允许的HTTP方法。
  • Access-Control-Allow-Headers定义允许的请求头。

处理预检请求(OPTIONS)

对于复杂请求(如带自定义头或非简单方法的请求),浏览器会先发送OPTIONS预检请求。需单独处理:

php实现跨域请求

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
    header("Access-Control-Allow-Headers: Authorization, Content-Type");
    exit(0);
}

使用PHP代理请求

若无法直接修改目标服务器的CORS策略,可通过PHP代理转发请求:

$targetUrl = 'https://api.example.com/data';
$data = file_get_contents($targetUrl);
header('Content-Type: application/json');
echo $data;

此方法将客户端请求转发到目标服务器,再将响应返回给客户端,绕过浏览器的同源限制。

php实现跨域请求

携带Cookie的跨域请求

若需跨域携带Cookie,需设置以下头并启用withCredentials(前端):

header("Access-Control-Allow-Origin: https://client.example.com");
header("Access-Control-Allow-Credentials: true");
  • Access-Control-Allow-Origin必须明确指定域名,不能为*
  • Access-Control-Allow-Credentials: true允许发送Cookie。

完整示例代码

以下是一个支持GET/POST的跨域API示例:

// 允许跨域
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");

// 处理预检请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit(0);
}

// 处理实际请求
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    echo json_encode(['message' => 'GET request succeeded']);
} elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    echo json_encode(['received' => $input]);
}

注意事项

  • 生产环境中避免使用Access-Control-Allow-Origin: *,应限制为可信域名。
  • 对于敏感操作(如修改数据),建议结合CSRF防护措施。
  • 若API需支持多种HTTP方法(如PUT/DELETE),需在预检响应中明确列出。

标签: php
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php实现mvc

php实现mvc

PHP 实现 MVC 架构 MVC(Model-View-Controller)是一种常用的软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…