当前位置:首页 > 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实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('lo…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Cont…

php实现mvc

php实现mvc

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

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL…