
本文详解 php curl 请求遭遇 403 forbidden 的常见原因(如缺失 user-agent、缺少 referer、未启用 cookie 管理等),并提供可直接运行的修复代码,帮助开发者成功获取 british airways solr 接口的 json 数据。
本文详解 php curl 请求遭遇 403 forbidden 的常见原因(如缺失 user-agent、缺少 referer、未启用 cookie 管理等),并提供可直接运行的修复代码,帮助开发者成功获取 british airways solr 接口的 json 数据。
HTTP 403 Forbidden 错误表明服务器理解请求,但拒绝授权访问——这在调用第三方 API(尤其是航空、电商类网站)时极为常见。虽然 Postman 或浏览器能正常访问 https://www.britishairways.com/solr/...,但原生 cURL 默认不发送关键 HTTP 头部,易被服务端识别为非浏览器请求而拦截。
核心问题在于:British Airways 的 Solr 接口依赖客户端身份标识与会话状态,而原始代码中虽启用了 CURLOPT_COOKIESESSION => true,却未设置 User-Agent、Referer 和 Accept 等必需头部,也未启用 Cookie 存储机制(仅开启 session 不足以维持上下文)。
✅ 正确做法如下:
- 添加标准浏览器请求头:模拟真实用户行为;
- 启用 Cookie 支持:使用 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE 实现跨请求 Cookie 持久化;
- 显式声明 Content-Type 和 Accept:确保响应格式匹配预期;
- 检查 SSL 验证(生产环境慎用):若证书异常可临时禁用(仅调试),但正式部署必须启用验证。
以下是经验证可用的完整修复代码:
<?php $curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://www.britishairways.com/solr/lpbd/lpfdestinations?fq=departure_city:LON+AND+arr_city_name_search:***+AND+trip_type:RT+AND+number_of_nights:7+AND+cabin:M&facet.pivot=arrival_city,is_sales_fare&facet=true',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '', // 自动解压 gzip/deflate
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
// ✅ 关键修复:模拟浏览器头部
CURLOPT_HTTPHEADER => [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept: application/json, text/plain, */*',
'Referer: https://www.britishairways.com/',
'Accept-Language: en-US,en;q=0.9',
],
// ✅ 启用 Cookie 管理(必须!)
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => '/tmp/ba_cookies.txt', // 写入 Cookie
CURLOPT_COOKIEFILE => '/tmp/ba_cookies.txt', // 读取 Cookie
// ✅ 生产环境务必保留 SSL 验证(调试时可临时关闭)
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$error = curl_error($curl);
curl_close($curl);
if ($error) {
die("cURL Error: $error");
}
if ($httpCode !== 200) {
echo "HTTP $httpCode error returned.\n";
echo "Response: " . substr($response, 0, 500); // 截断输出便于排查
exit;
}
// 确保输出为合法 JSON(原答案中 json_encode($response) 是错误的——$response 已是 JSON 字符串)
header('Content-Type: application/json; charset=utf-8');
echo $response;
⚠️ 注意事项:
- *** 占位符需替换为实际目的地城市名(如 PARIS),否则查询将无结果;
- Cookie 文件路径 /tmp/ba_cookies.txt 需确保 Web 服务器有写权限;
- 若仍返回 403,请检查目标接口是否启用 Bot 检测(如 Cloudflare),此时需引入 Puppeteer 或代理池方案;
- 原答案中 json_encode($response) 属严重误用——该接口返回已是 JSON 字符串,二次编码会导致无效 JSON(如 "{"data":...}"),应直接输出。
总结:403 错误本质是服务端权限控制策略的体现。解决思路始终围绕「让 cURL 请求尽可能接近浏览器行为」——头部、Cookie、SSL、重定向缺一不可。调试时善用 curl_getinfo() 和 HTTP 状态码判断,避免盲目修改参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











