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

PHP cURL请求Cloudflare站点报403错误1020走Fiddler代理正常原因查询

问题原因分析

Cloudflare返回error code: 1020代表请求触发了站点配置的自定义防火墙拦截规则,该现象和SSL证书无关:你的代码中已经通过CURLOPT_SSL_VERIFYHOST、CURLOPT_SSL_VERIFYPEER关闭了SSL证书校验,Fiddler的自签名证书不会对请求结果产生影响。加Fiddler代理后请求正常的常见原因如下:

  • TLS/JA3指纹匹配拦截:cURL默认的TLS握手特征(JA3指纹)属于明确的爬虫特征,Cloudflare的指纹识别库会直接标记拦截。Fiddler转发请求时会使用自身的TLS协议栈与Cloudflare建立连接,JA3指纹和常规浏览器特征一致,因此可以绕过拦截。
  • 请求格式异常被自动修正:你的代码存在两处请求格式不匹配问题:
    1. POST提交的payload是JSON格式,但请求头Content-Type配置为application/x-www-form-urlencoded,格式不匹配
    2. Content-Length取值为strlen($data),但CURLOPT_POSTFIELDS使用的是硬编码的JSON字符串,和$data变量的实际长度可能不一致
      Cloudflare会校验请求头和请求体的一致性,格式异常会直接触发拦截。Fiddler转发请求时会自动校正错误的请求头参数,因此修正后的请求可以正常通过校验。
  • IPv6访问拦截:如果你的网络同时支持IPv4/IPv6,cURL默认会优先使用IPv6发起请求,很多站点的Cloudflare规则会拦截异常IPv6段的请求。Fiddler默认仅转发IPv4请求,因此切换为IPv4访问后就可以正常请求。
  • 自动补全验证Cookie:如果你之前通过浏览器配合Fiddler访问过目标站点,Fiddler会自动将浏览器生成的cf_clearance等Cloudflare验证Cookie附加到转发的请求中,而直接用cURL请求时没有这类有效验证Cookie,就会触发拦截。

修复建议

先修正代码中的请求格式错误,将Content-Type改为application/json,同时保证CURLOPT_POSTFIELDS和Content-Length取值匹配;如果还是被拦截,可以替换原生cURL,使用支持模拟浏览器TLS指纹的Cloudflare专用爬取库即可。

内容的提问来源于stack exchange,提问作者Imran Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:09:01