Fetch API 默认自动跟随重定向(最多20次),设 redirect: "follow"(默认)返回最终响应;设 "manual" 时返回原始重定向响应,可读取 Location 头手动处理;设 "error" 则遇重定向直接抛 TypeError。

Fetch API 默认会自动跟随 HTTP 重定向(如 301、302),但你可以通过 redirect 选项显式控制这一行为。
允许自动跟随重定向(默认行为)
不传 redirect 选项,或设为 "follow",fetch 会自动处理最多 20 次重定向,并最终返回最终响应:
fetch('/login', { method: 'POST', body: formData })
.then(response => {
// response 是重定向后的最终响应(如 200)
console.log(response.url); // 最终 URL
});
注意:即使中间经过多次跳转,你拿到的 response 始终是最终目标资源的响应,原始重定向响应不可见。
禁止重定向,获取原始重定向响应
设置 redirect: "manual" 后,fetch 遇到 3xx 状态码时不会跳转,而是直接返回该重定向响应,且 response.url 保持为原始请求 URL:
立即学习“Java免费学习笔记(深入)”;
fetch('/old-path', { redirect: 'manual' })
.then(response => {
if (response.redirected) {
console.log('发生了重定向');
console.log('状态码:', response.status); // 如 302
console.log('Location 头:', response.headers.get('Location'));
console.log('原始 URL:', response.url); // 仍是 /old-path
}
});
此时你可以手动解析 Location 头并决定是否发起新请求,适合需要审计跳转链、拦截敏感重定向等场景。
禁止重定向并抛出错误
设置 redirect: "error" 会让 fetch 在遇到任何重定向响应(3xx)时直接拒绝 Promise,抛出 TypeError:
fetch('/api/data', { redirect: 'error' })
.then(response => console.log('成功'))
.catch(err => {
// err 是 TypeError,消息类似 "Redirects are not allowed for this request"
console.error('重定向被阻止:', err);
});
这个选项适合严格要求“无跳转”的接口调用,比如某些 OAuth 回调验证或调试阶段排查意外跳转。
注意事项与常见问题
- 重定向过程中,
credentials(如 cookie)是否携带取决于redirect模式和credentials设置本身;"manual"和"error"下不会自动发送凭据到重定向目标 -
redirect: "manual"时,响应体(response.body)为空,因为浏览器不提供重定向响应的 body(符合规范) - 服务端返回的
Location可能是相对路径,需用new URL(location, response.url)解析为绝对地址 - 跨域重定向受 CORS 限制:若重定向目标是不同源,且未正确配置 CORS 头,手动发起二次请求仍可能失败


















