如何解决PHP跳转外部URL时出现的302错误
修复cURL处理短链接跳转时的302错误
短链接返回302是临时重定向响应,你的cURL代码默认不会自动跟随这类重定向,所以才会出现问题。解决方法很简单,给cURL添加自动跟随重定向的配置即可:
关键修改点
- 启用
CURLOPT_FOLLOWLOCATION选项,让cURL自动追踪重定向 - 可选设置
CURLOPT_MAXREDIRS限制最大重定向次数,防止陷入无限循环
修改后的完整代码
<?php function openURL($url) { // 创建cURL资源 $ch = curl_init(); // 设置目标URL curl_setopt($ch, CURLOPT_URL, $url); // 禁用SSL证书验证(生产环境建议开启,这里保留原配置) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 返回响应内容而非成功状态码 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 限制最大重定向次数为10次 curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 不返回响应头部 curl_setopt($ch, CURLOPT_HEADER, 0); $data = curl_exec($ch); curl_close($ch); return $data; } if (isset($_POST['clickHere'])) { echo openURL('https://link.short2url.in/yL9E'); } ?> <!DOCTYPE html> <html> <body> <form method="POST"> <button name="clickHere">Click Here To Open External URL in PHP</button> </form> </body> </html>
补充说明
如果你的PHP环境开启了safe_mode或者设置了open_basedir,CURLOPT_FOLLOWLOCATION会失效。这种情况下需要手动解析响应头部中的Location字段,手动发起新的请求。示例逻辑如下:
function openURL($url, $maxRedirects = 10) { if ($maxRedirects <= 0) { return false; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); // 开启头部获取 curl_setopt($ch, CURLOPT_NOBODY, false); $response = curl_exec($ch); $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $headerSize); $body = substr($response, $headerSize); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 检查是否是重定向响应 if (in_array($httpCode, [301, 302, 303, 307, 308])) { // 提取Location头部 preg_match('/Location: (.*)\r\n/', $headers, $matches); if (!empty($matches[1])) { $newUrl = trim($matches[1]); // 递归跟随重定向 return openURL($newUrl, $maxRedirects - 1); } } return $body; }
内容的提问来源于stack exchange,提问作者Thamarai TAMIL
相关产品推荐
相关产品推荐

