php实现跨域请求
跨域请求的基本概念
跨域请求是指浏览器出于安全考虑,限制从一个源(协议、域名、端口)发起的请求访问另一个源的资源。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预检请求。需单独处理:

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;
此方法将客户端请求转发到目标服务器,再将响应返回给客户端,绕过浏览器的同源限制。

携带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),需在预检响应中明确列出。






