Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清

Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清

做 SEO,重定向是绕不开的。换域名、改 URL 结构、下架产品,都要靠 301 把老地址指到新地址。但重定向一旦写岔,会出两种麻烦:一种是链条过长,A 跳到 B、B 跳到 C,用户和爬虫跟着绕好几圈,页面加载变慢、权重被层层稀释;另一种更严重,是成环,A 跳 B、B 又跳回 A,浏览器直接报错,谷歌爬虫也放弃抓取。这篇写一个 Node.js 工具,输入一个 URL,把整条重定向链、跳数、是否成环、最终落点一次查清。

谷歌对重定向的官方说明看这里:重定向与谷歌搜索。

工具能检查什么

  1. 跟随重定向,记录每一跳的来源、状态码、目标
  2. 统计总共跳了几次
  3. 检测是否成环(A 又跳回已经出现过的地址)
  4. 输出最终落点和最终状态码

用 Node.js 原生 fetch,redirect 设为 manual 才能拿到 301/302 本身,不装任何依赖。

完整代码

javascript 复制代码
// redirect-check.js
// 用途:检查 URL 的重定向链(跳数、成环、最终落点)
// 运行:node redirect-check.js https://example.com/old-page
// 依赖:无(Node 18+ 自带 fetch)

const MAX_HOPS = 10; // 最多检测 10 跳

async function main() {
  const start = process.argv[2] || 'https://example.com/old-page';
  let current = start;
  const chain = [];
  const visited = new Set([start]);

  for (let hop = 0; hop < MAX_HOPS; hop++) {
    let res;
    try {
      res = await fetch(current, {
        method: 'GET',
        redirect: 'manual',
        headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0 Safari/537.36' },
      });
    } catch (e) {
      chain.push({ from: current, status: '请求失败', to: null });
      break;
    }

    if (res.status >= 300 && res.status < 400) {
      const next = res.headers.get('location');
      chain.push({ from: current, status: res.status, to: next });
      if (!next) {
        console.log('重定向但缺少 Location 头,链条中断');
        break;
      }
      const absolute = new URL(next, current).href;
      if (visited.has(absolute)) {
        chain.push({ from: current, status: '成环', to: absolute });
        console.log('检测到重定向环:' + absolute);
        break;
      }
      visited.add(absolute);
      current = absolute;
      continue;
    }

    chain.push({ from: current, status: res.status, to: null });
    break;
  }

  console.log('===== 重定向链 =====');
  chain.forEach((c, i) => {
    if (c.to) console.log(`第${i + 1}跳  ${c.from}\n        ${c.status} -> ${c.to}`);
    else console.log(`第${i + 1}跳  ${c.from}\n        ${c.status}(终点)`);
  });
  console.log(`\n共 ${chain.length} 跳`);
  if (chain.length >= MAX_HOPS) console.log('提示:达到最大检测跳数,可能仍有后续重定向');
  console.log('===== 结束 =====');
}

main();

怎么用

bash 复制代码
node redirect-check.js https://你的域名/旧页面

把地址换成你要检查的 URL,运行。它会打印出每一跳从哪到哪、状态码是什么、最终落在哪个地址。

三个最常见的重定向问题

重定向链过长。 一个页面 301 到另一个,另一个又 301 到第三个,跳了三五跳才到真页面。每一次跳转都消耗加载时间和爬虫抓取预算,还摊薄权重。理想做法是一步到位,老地址直接 301 到最终目标。

重定向成环。 A 跳 B、B 跳回 A,或者三四个页面互相跳。浏览器报"重定向次数过多",谷歌直接放弃这个 URL。这种环往往是多次改版叠加出来的,工具会直接标出来。

重定向到 404。 301 指向的目标页面本身已经不存在了,等于把用户和爬虫导向一个死胡同。这种"断头重定向"比普通死链更隐蔽,检查时要看最终落点的状态码是不是 200。

写在最后

重定向是站点改版里最容易埋雷的地方,而且问题往往要等排名掉了才暴露。用这个工具把关键的老 URL 都过一遍,链长、成环、断头一次揪出来。

延伸阅读:谷歌 SEO 系统实操。👈直接点击跳转

觉得有用欢迎点赞、收藏、转发,有疑问评论区留言或私信交流。

相关推荐
学逆向的1 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
曲径海盗1 小时前
【Python 学习第 37 天】for 循环
python·学习笔记·编程入门
心静财富之门1 小时前
Python 数据共享四种方案完整实例(同进程 / JSON / Redis / HTTP)
数据库·python·oracle
低调滴开发2 小时前
3 行代码写崩一个函数?切片才是 Rust 字符串处理的正确姿势
开发语言·后端·rust
代码丰2 小时前
跨系统传输大 JSON:直接压缩,还是把数据放进 Redis?
redis·后端·json
CodeYp20192 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
王仔小奶2 小时前
慢SQL治理与性能调优:DBA如何用Shell/Python提升运维效率?
python·sql·dba
用户0332126663672 小时前
使用 Python 快速在 PowerPoint 中生成表格【教程】
python
猫猫.1532 小时前
HashTable、HashMap、ConcurrentHashMap 核心区别总结
java·开发语言·java-ee