为什么PHP中curl_exec发送请求时未向服务端传递Authorization令牌?
问题原因与解决方案
以下是可能导致该问题的几个常见原因及对应修复方案:
请求触发3xx重定向,cURL默认不转发Authorization头
cURL默认配置下,遇到301/302等重定向响应时,不会将Authorization头传递给重定向后的目标地址,导致最终请求没有携带令牌。
修复方法:在你的cURL配置中添加以下两行参数:// 允许自动跟随重定向 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 允许重定向时携带Authorization头 curl_setopt($curl, CURLOPT_UNRESTRICTED_AUTH, true);你采集的日志并非PHP cURL发出的请求日志
对比你提供的两份日志可以发现,PHP代码对应请求的UA、Accept、Sec-Fetch系列字段完全是浏览器请求的特征,和cURL默认请求特征、Reqbin请求特征完全不符,大概率是你误将浏览器访问PHP文件的请求日志,当成了PHP内部cURL发出的请求日志。
验证方法:在cURL执行前添加参数开启请求头输出,执行后打印实际发出的请求头,确认是否携带Authorization:// 开启记录请求头 curl_setopt($curl, CURLINFO_HEADER_OUT, true); $resp = curl_exec($curl); // 打印实际发出的请求头 var_dump(curl_getinfo($curl, CURLINFO_HEADER_OUT));cURL环境兼容问题
部分老旧版本的cURL对无scheme前缀的Authorization头处理存在异常,可以尝试调整头的写法,添加令牌类型前缀,同时新增一个测试用的自定义头,确认是否是所有自定义头都被丢弃:$headers = array( "Authorization: Bearer sdfascvthsgdgdssgvsgscf", "X-Test-Header: testvalue" );本地代理配置导致头被丢弃
如果你的PHP运行环境配置了全局HTTP代理,部分代理会默认丢弃Authorization头避免敏感信息泄露,可以在cURL配置中添加参数强制不使用代理:curl_setopt($curl, CURLOPT_PROXY, '');
内容的提问来源于stack exchange,提问作者M_Sanders
相关产品推荐
相关产品推荐

