fetch api 的 redirect 参数控制重定向行为,默认为"follow";可选"error"(遇重定向抛typeerror)、"manual"(返回原始重定向响应供手动处理);需注意cookie/authorization不自动携带、response.redirected仅manual下有效、304不受控、cors跨域重定向可能失败。

Fetch API 的 redirect 参数用于控制请求遇到 HTTP 重定向响应(如 301、302、307、308)时的行为,默认为 "follow",即自动跟随重定向。你可以显式设置它来改变默认逻辑,尤其在需要拦截、观察或阻止重定向时非常关键。
redirect 可选值及含义
该参数接受三个字符串值:
-
"follow":默认行为。Fetch 自动发起新的请求,追踪重定向链,最终返回最终响应(注意:重定向过程中的中间响应不可见,
Response.url是最终 URL)。 -
"error":遇到任何重定向状态码(3xx)时,直接拒绝 Promise,抛出
TypeError(不是网络错误,而是类型错误,提示 "Failed to fetch" 或类似信息)。 -
"manual":遇到重定向响应时,Fetch 不自动跳转,而是返回原始重定向响应对象(如
Status: 302),允许你手动检查response.redirected、response.status和response.headers.get("Location"),再决定是否用新 URL 发起下一次请求。
使用 manual 拦截并自定义重定向逻辑
当你需要审计重定向路径、添加认证头、限制跳转次数或记录跳转链时,"manual" 最有用:
fetch("/api/redirect-test", { redirect: "manual" })
.then(response => {
if (response.redirected) {
const location = response.headers.get("Location");
console.log("被重定向到:", location);
// 可在此添加逻辑,比如只允许同域跳转
if (location && new URL(location).origin === location.origin) {
return fetch(location, { redirect: "manual" });
} else {
throw new Error("跨域重定向被拒绝");
}
}
return response;
})
.then(data => data.json())
.catch(err => console.error(err));
使用 error 主动拒绝重定向
适用于严格要求“无跳转”的场景,例如调试接口是否被意外代理重写,或确保请求直达源站:
- 若后端返回 302,而你期望得到该响应本身(比如验证登录态跳转逻辑),
"error"会立即失败,此时应改用"manual"。 - 若你希望“只要发生重定向就报错”,用
"error"最简洁;但注意它不提供重定向详情,仅中断流程。
注意事项与常见误区
注意:无论 redirect 设为何值,Fetch 都不会将重定向过程中的 Cookie 或 Authorization 头自动带上后续请求(除非服务端明确允许且浏览器策略许可)。特别是 "manual" 模式下,手动发起二次请求时需自行携带必要 headers。
-
response.redirected是布尔值,仅在"manual"下为true时有意义;其他模式下恒为false。 - 304(Not Modified)不属于重定向,不受
redirect控制,它属于条件请求成功响应。 - CORS 请求中,若重定向目标是跨域资源,且未通过 CORS 预检或响应头未包含
Access-Control-Allow-Origin,即使"follow"也会因 CORS 错误终止。










