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

为什么部分URL使用npm包follow-redirects无法正常跟随重定向

问题根因
  • 你测试的thebookdepository.co.uk域名未对外开放443端口的HTTPS服务,仅开放了80端口的HTTP服务
  • 你的代码直接调用https.request向该域名的443端口发起请求,连接直接被拒绝,根本没有进入重定向处理流程
  • 浏览器访问正常是因为地址栏输入不带协议的域名时,默认先向80端口发起HTTP请求,该域名的HTTP服务会返回301重定向到https://www.bookdepository.com,后续再走HTTPS请求就正常了
  • 额外问题:你的代码没有监听请求的error事件,一旦请求出错就会抛出未处理异常,直接导致进程崩溃
解决思路
  1. 优先使用HTTP协议发起裸域名请求,避免目标域名未开通HTTPS导致的连接失败,follow-redirects默认支持跟随跨HTTP/HTTPS协议的重定向
  2. 所有请求必须添加error事件监听,捕获异常避免进程崩溃,同时可添加协议降级逻辑:HTTP请求失败时再尝试HTTPS请求
  3. 尽量直接传入完整URL字符串发起请求,不要手动拆分host、path参数,避免协议、端口匹配错误
  4. 部分站点会拦截无User-Agent的请求,可添加浏览器UA头降低被拦截概率
修复后代码示例
const { request } = require("follow-redirects");

// 优先以HTTP协议发起请求
const targetUrl = new URL("http://thebookdepository.co.uk");
// 添加浏览器UA头,避免被站点拦截
targetUrl.headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
};

const req = request(targetUrl, (res) => {
  console.log("最终跳转地址:", res.responseUrl);
});

// 监听请求错误,添加强降级逻辑
req.on('error', (err) => {
  console.warn("HTTP请求失败,尝试HTTPS请求:", err.message);
  targetUrl.protocol = "https:";
  const fallbackReq = request(targetUrl, (res) => {
    console.log("最终跳转地址:", res.responseUrl);
  }).on('error', (fallbackErr) => {
    console.error("该域名不可访问:", fallbackErr.message);
  });
  fallbackReq.end();
});

req.end();

运行上述代码就可以正常获取到最终跳转地址https://www.bookdepository.com/。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:48:03