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

