You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP CURL调用URL返回403错误,终端/浏览器/Postman可正常访问

解决PHP CURL调用返回403错误的问题

核心原因分析

403 Forbidden错误通常是目标服务器的反爬机制或请求校验规则拦截了PHP CURL的请求。对比终端curl、浏览器等正常请求,差异主要集中在请求头完整性和CURL默认配置缺失上。

针对性修复方案

1. 添加合法的User-Agent请求头

终端curl、浏览器都会自带标准的User-Agent标识,而PHP CURL默认无此配置,这是最常见的拦截触发点。在CURLOPT_HTTPHEADER中添加符合浏览器规范的User-Agent:

'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'

2. 移除多余的Content-Type头

当前请求为GET方法,GET请求不需要设置Content-Type,这个冗余头可能触发服务器的校验逻辑,直接删除'Content-Type: text/html'这一行。

3. 确保Cookie的有效性与格式

检查Cookie是否过期,建议直接从浏览器的请求头中复制最新的完整Cookie值替换当前内容,避免手动复制时出现截断或格式错误。

4. 处理HTTPS SSL验证(可选)

如果目标地址是HTTPS,PHP CURL可能因SSL验证不通过被拦截,可临时添加以下配置跳过验证(生产环境建议指定合法CA证书路径以开启验证):

CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,

5. 模拟终端curl的默认行为

终端curl会自动处理请求跳转和来源引用,添加以下配置让PHP CURL更贴近终端行为:

CURLOPT_AUTOREFERER => true,
CURLOPT_FOLLOWLOCATION => true,

修复后的完整代码

<?php
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'ANY_URL',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Cookie: ak_bmsc=FD8C3DE69E40A4C5DDAE330F260728D2~000000000000000000000000000000~YAAQVbopFx/wBzaOAQAAe+NdPBdrcmBV8EcoZ2aCTbyfXmfqhWROo32ff8B4/8Pn3DYRniT5jVnZ7Xoh4U/HAQxOb/xutXrv9tjMMkoFbHDFXXCh6X9R8wXZLsBkgiDuR585gKO2I7MkwxZ5qQISPrESJJJfKdVtPXZdTsHuSYIO5M63GLD4m9Z6cRieNRhVp4eftLfBOxhOrg64xTg05bI3qB6/p1JDi5rpkbVF/1TmHwg4gKpN5TGB5L7YEir2lGdKzL5k6DzUSZJueF3Lz0vCM+cI4S0u3expGMZJlmIbfzsR6x1Vda7XoslAmFXDaZiP7Sk8sH5IcNSVFmsMnkWKdiBNp3U+R1t7pkYmGlM2BJossoqCMhyNUA==',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
  ),
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_SSL_VERIFYHOST => false,
));

$response = curl_exec($curl);

// 调试错误信息(可选)
if(curl_errno($curl)){
    echo 'CURL错误:' . curl_error($curl);
}

curl_close($curl);
echo $response;
?>

后续调试技巧

若问题仍存在,可通过以下方式进一步排查:

  • 用curl_getinfo($curl)获取请求的详细元数据,对比终端curl的请求头差异
  • 在终端执行curl -v ANY_URL,复制完整的请求头,完全复刻到PHP CURL中

内容的提问来源于stack exchange,提问作者Avinash Dalvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:04:53