重定向时Authorization Header未携带Bearer Token问题排查
在PHP中设置Authorization头后执行301重定向,目标站点无法获取到Bearer令牌,环境为PHP 8.3、Apache/2.4.52(Ubuntu),已配置.htaccess的SetEnvIf规则,cURL调用正常但浏览器重定向时令牌丢失,调整头顺序和大小写无效。
问题原因
浏览器遵循HTTP安全规范,跨域场景下的301/302重定向不会自动携带Authorization请求头;而cURL默认会跟随重定向并保留所有请求头,因此出现测试结果不一致的情况。
解决方案
通过URL查询参数传递(仅限HTTPS环境)
将令牌编码后放在URL参数中,目标站点从GET参数获取并验证:header('Location: http://nextsite.com/home/index?token=' . urlencode($retval), true, 301); exit();目标站点处理示例:
if (isset($_GET['token'])) { $token = $_GET['token']; // 验证Bearer令牌逻辑 }使用自动提交表单传递(支持POST场景)
生成自动提交的表单,将令牌作为隐藏字段传递,避免URL暴露令牌:?> <form id="autoRedirect" method="POST" action="http://nextsite.com/home/index"> <input type="hidden" name="auth_token" value="Bearer <?php echo htmlspecialchars($retval); ?>"> </form> <script> document.getElementById('autoRedirect').submit(); </script> <?php exit();目标站点处理示例:
if (isset($_POST['auth_token'])) { $authHeader = $_POST['auth_token']; // 验证令牌逻辑 }服务器端代理转发请求
不直接重定向,由当前PHP服务器作为代理,携带令牌请求目标站点后返回结果:$targetUrl = 'http://nextsite.com/home/index'; $ch = curl_init($targetUrl); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $retval ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 若目标站点是HTTPS,需根据情况配置SSL验证 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 转发目标站点的响应头和内容 http_response_code($httpCode); echo $response; exit();同域场景下的CORS配置(仅限同域)
若目标站点与当前站点同域,可在目标站点的.htaccess或Apache配置中添加CORS规则,允许携带Authorization头:Header always set Access-Control-Allow-Origin "http://yoursite.com" Header always set Access-Control-Allow-Headers "Authorization" Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS"但此方法仅适合同域或已配置信任的跨域场景,浏览器仍可能有严格限制。
内容的提问来源于stack exchange,提问作者Mads Peter Jensen
相关产品推荐
相关产品推荐

