为何CMD与PHP cURL请求同一站点返回不同HTTPS状态码?
为何PHP cURL请求OnlyFans返回403,而CMD的cURL返回200?
使用PHP cURL请求https://onlyfans.com时返回403状态码,但用CMD的cURL命令测试却能返回200,这是为什么?
CMD cURL命令
curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" https://onlyfans.com --ssl-no-revoke
CMD请求结果:
PHP cURL代码
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://onlyfans.com"); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //curl_setopt($ch, CURLOPT_VERBOSE, true); $response = curl_exec($ch); if (curl_errno($ch)) { echo "cURL Error: " . curl_error($ch); } else { echo $response; } curl_close($ch); ?>
PHP请求结果:
补充:开启VERBOSE后的输出

可能的原因及解决方案
1. 请求头不完整
CMD的curl默认会自动携带部分请求头(如Accept、Accept-Language),而PHP cURL默认不会设置这些。OnlyFans的反爬机制会校验请求头的完整性,缺失关键头会触发403。
解决办法:手动添加完整的请求头:
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ]);
2. Cookie会话差异
CMD curl可能会复用本地缓存的Cookie,而PHP cURL默认是无状态请求,没有携带Cookie。部分网站会通过Cookie验证请求合法性。
解决办法:启用Cookie持久化:
// 保存Cookie到文件 curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // 读取Cookie文件发送请求 curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
3. SSL/TLS版本不匹配
PHP cURL依赖的SSL库版本可能与CMD curl不同,导致TLS握手时被服务器拒绝。
解决办法:强制指定TLS版本:
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
4. HEAD请求限制
虽然CMD用了-I(对应PHP的CURLOPT_NOBODY=true)发送HEAD请求,但服务器可能对PHP环境的HEAD请求有额外限制。
解决办法:尝试关闭CURLOPT_NOBODY,获取完整响应:
curl_setopt($ch, CURLOPT_NOBODY, false);
5. IP地址被封禁
PHP运行环境(如服务器)的IP可能被OnlyFans列入黑名单,而本地CMD使用的IP未被限制。
解决办法:检查IP是否可正常访问OnlyFans,必要时更换IP或使用代理。
内容的提问来源于stack exchange,提问作者unice
相关产品推荐
相关产品推荐

