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等)。
测试场景验证
- 无重定向URL:直接输出原URL和200 OK,无任何报错。
- 多轮重定向(URL1→URL2→URL3→URL4):完整展示所有跳转节点,直到最终目标URL。
- 相对路径重定向:自动拼接为绝对URL,不会出现无效路径。
内容的提问来源于stack exchange,提问作者ramesh singh
相关产品推荐
相关产品推荐

