PHP cURL请求返回403但Postman正常的问题求助
问题原因与解决方案
核心差异点分析
对比你的PHP cURL和Postman请求头,以下几个差异是导致403 Forbidden的关键:
- 非法空值请求头:你在PHP代码中添加了
X-Ovhrequest-Id:、X-Forwarded-Proto:这类带空值的请求头,这类不符合HTTP规范的头可能被目标服务器的安全机制拦截。 - Host头不匹配:目标URL的域名是
lmt.fn.sportradar.com,但你的PHP cURL请求中Host头被设置为[myhost.com](大概率是服务器环境自动注入的错误值),错误的Host头会触发服务器的访问限制逻辑。 - 缺失标准请求头:Postman发送了
Accept-Encoding: gzip, deflate, br,你的PHP cURL缺少这个头,部分服务器会以此作为请求合法性的判断依据。
修复后的PHP cURL代码
// 仅保留Postman中明确发送的必要请求头 $headers = [ 'User-Agent: PostmanRuntime/7.29.2', 'Accept: */*', 'Accept-Encoding: gzip, deflate, br', 'Connection: keep-alive', 'Host: lmt.fn.sportradar.com' // 强制设置正确的目标域名Host头 ]; // 初始化cURL $curl = curl_init(); // 配置cURL参数 curl_setopt($curl, CURLOPT_URL, 'https://lmt.fn.sportradar.com/common/fr/Etc:UTC/gismo/match_info/43067423'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_HEADER, 0); // 启用自动编码处理,匹配Postman的编码行为 curl_setopt($curl, CURLOPT_ENCODING, ''); // 执行请求 $response = curl_exec($curl); // 检查请求错误 if(curl_errno($curl)){ echo 'Curl错误: ' . curl_error($curl); } curl_close($curl);
额外注意事项
- 不要添加任何环境特定或用途不明的请求头(比如
X-Ovhrequest-Id这类非标准头),只保留符合HTTP规范的通用头。 - 如果你通过代理访问,需确保代理不会篡改Host头;直接请求时,强制设置Host头为目标域名是最稳妥的方式。
CURLOPT_ENCODING: ''会让cURL自动适配服务器支持的编码格式,和Postman的行为完全一致。
内容的提问来源于stack exchange,提问作者Pop
相关产品推荐
相关产品推荐

