如何通过Fetch请求获取重定向页面?遇401状态码问题
问题排查与修复方案
核心差异分析
对比你的代码和Insomnia生成的代码,几个关键问题导致了401错误:
- Cookie头重复拆分:你同时传了
cookie和Cookie两个头,服务器大概率无法正确合并识别所有凭证;而Insomnia是把CSRF和JSESSIONID合并到一个Cookie头里,仅额外保留了一个冗余的cookie头(核心是完整凭证在同一个头中)。 - Content-Type不匹配:你设置了
text/html类型,但目标服务器在Insomnia请求里接受的是multipart/form-data(虽然GET请求带body不符合HTTP规范,但部分服务器会特殊处理)。 - Node环境下
credentials无效:credentials: "include"是浏览器专属参数,node-fetch/isomorphic-fetch在Node环境下不支持,凭证必须完全通过Cookie头传递。
修复后的代码
async function getPage(cookie, jsid) { // 把所有Cookie合并到一个头,格式要确保是 "csrf-token-name=xxx; csrf-token-value=xxx; JSESSIONID=xxx" const combinedCookie = `${cookie}; ${jsid}`; const params = { method: "GET", headers: { "Cookie": combinedCookie, "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" // 删掉多余的content-type和重复的cookie头 }, redirect: "follow", // Node环境下不需要credentials参数,直接靠Cookie头传凭证 }; console.log("请求参数:", params); try { const res = await fetch('https://portal.elpts.ru/portal', params); console.log("响应状态:", res); // 注意:原页面是HTML,这里用text解析,Insomnia里的json是自动生成的,可能不符合实际响应 const content = await res.text(); console.log("响应内容:", content); } catch (err) { console.error("请求错误:", err); } }
额外注意点
- Cookie格式要准确:确认
cookie参数包含完整的CSRF凭证(csrf-token-name=csrftoken; csrf-token-value=xxx),jsid参数是JSESSIONID=xxx格式,合并后不要有多余的分号或空格。 - GET请求的Body:Insomnia生成的代码加了FormData body,但GET请求带body不符合HTTP标准,建议先移除;如果服务器强制要求,再引入form-data库并添加
body: new FormData()。 - fetch库版本:尽量用node-fetch v2.x版本(v3.x是ESM模块,容易出现兼容性问题),isomorphic-fetch在Node环境下依赖node-fetch,版本要匹配。
内容的提问来源于stack exchange,提问作者lian. lun
相关产品推荐
相关产品推荐

