PHP cURL请求返回403错误 Postman/浏览器访问正常如何解决
问题根因
- 英航官网前端部署了WAF反爬规则,默认PHP cURL不带浏览器特征的请求会被直接拦截返回403
- 单独配置
CURLOPT_COOKIESESSION无法实现Cookie的自动存储和携带,该参数仅控制是否开启新会话,不会落地存储Cookie文件,服务端下发的校验Cookie在请求结束后会直接丢失 - 缺失浏览器请求必带的基础头字段,尤其是
User-Agent,默认cURL的UA标识会被直接识别为脚本请求
修复后可运行代码
// 配置Cookie存储路径,确保该路径PHP进程有读写权限 $cookieFile = __DIR__ . '/ba_cookie.txt'; $curl = curl_init(); curl_setopt_array($curl, array( 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, br', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 15, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, // 开启Cookie自动读写,自动携带服务端下发的校验Cookie CURLOPT_COOKIEJAR => $cookieFile, CURLOPT_COOKIEFILE => $cookieFile, // 模拟正常Chrome浏览器的User-Agent CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', // 补全浏览器默认请求头,模拟页面发起的请求 CURLOPT_HTTPHEADER => array( 'Accept: application/json, text/plain, */*', 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8', 'Referer: https://www.britishairways.com/', 'Connection: keep-alive' ), // 本地测试如果报SSL证书校验错误再打开下面两行,生产环境请保持SSL校验开启 // CURLOPT_SSL_VERIFYPEER => false, // CURLOPT_SSL_VERIFYHOST => false, )); $response = curl_exec($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($httpCode == 200) { header('Content-Type: application/json'); echo $response; } else { echo "请求失败,状态码:" . $httpCode; }
配置说明
- 代码移除了多余的
CURLOPT_CUSTOMREQUEST => 'GET'配置,GET是cURL默认请求方法,手动指定该参数会改变cURL的默认请求行为,反而容易触发反爬规则 - 把原配置中0值的无超时改成了15秒,无超时的长连接会被服务端判定为异常连接直接拒绝
- 如果替换配置后仍返回403,直接打开浏览器DevTools的网络面板,找到该接口成功请求的全部请求头,逐行复制替换代码里的
CURLOPT_HTTPHEADER部分即可,重点不要漏sec-ch-ua系列客户端特征头 - 首次请求时cURL会自动把服务端返回的校验Cookie写入指定的Cookie文件,后续请求自动携带即可绕过Cookie校验逻辑,不要手动删除该Cookie文件
内容的提问来源于stack exchange,提问作者qqruza
相关产品推荐
相关产品推荐

