You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中URL重定向追踪问题:get_headers异常及报错修复求助

解决PHP中get_headers追踪多轮重定向路径的问题

问题分析

你的代码存在几个关键问题,导致无法覆盖所有重定向场景,还会触发报错:

  • 变量名不一致:定义了$headerarray但循环中使用$headerarr1,直接引发未定义变量错误。
  • get_headers参数错误:第二个参数需传入1才能返回包含Location等关联键的数组,你传入的5不符合预期。
  • 未做存在性检查:当URL无重定向时,$headers中不存在Location字段,直接访问会触发"Undefined Offset"错误。
  • 循环逻辑僵化:固定循环10次,不如根据实际返回的状态行数量动态遍历。
  • 缺失最终状态展示:原代码未处理最后一步的非重定向状态(如200 OK),导致跳转链不完整。

修复后的完整代码

$url = "https://somedomain.com";
// 传入参数1,获取带关联键的头信息数组
$headers = get_headers($url, 1);

// 存储完整跳转路径
$redirectPath = [];
$currentUrl = $url;
$redirectPath[] = $currentUrl;

// 检查是否存在重定向Location
if (isset($headers['Location'])) {
    // 统一处理单次/多次重定向的Location格式(字符串转数组)
    $locations = is_array($headers['Location']) ? $headers['Location'] : [$headers['Location']];
    
    foreach ($locations as $location) {
        // 处理相对路径的重定向,拼接为绝对URL
        if (strpos($location, 'http') !== 0) {
            $parsedCurrent = parse_url($currentUrl);
            $baseUrl = $parsedCurrent['scheme'] . '://' . $parsedCurrent['host'];
            $basePath = rtrim($parsedCurrent['path'] ?? '', '/') . '/';
            $location = $baseUrl . $basePath . ltrim($location, '/');
        }
        $redirectPath[] = $location;
        $currentUrl = $location;
    }
}

// 输出跳转路径和最终状态
echo "完整跳转路径:<br>";
echo implode(" → ", $redirectPath) . "<br>";

// 提取并输出最终HTTP状态
$statusLines = array_filter($headers, 'is_string');
$finalStatus = end($statusLines);
echo "最终状态:" . $finalStatus;

关键改进说明

  • 变量统一与参数修正:统一变量名并正确使用get_headers参数,确保数组结构符合预期。
  • Location安全处理:先判断Location是否存在,再处理;同时统一字符串/数组格式,避免类型错误。
  • 相对路径兼容:自动将相对路径重定向转为绝对URL,保证跳转追踪的准确性。
  • 动态路径展示:不管有无重定向,都能完整输出跳转链,同时展示最终的HTTP状态(如200 OK、404 NotFound等)。

测试场景验证

  1. 无重定向URL:直接输出原URL和200 OK,无任何报错。
  2. 多轮重定向(URL1→URL2→URL3→URL4):完整展示所有跳转节点,直到最终目标URL。
  3. 相对路径重定向:自动拼接为绝对URL,不会出现无效路径。

内容的提问来源于stack exchange,提问作者ramesh singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:45:56