response.redirect() 不触发浏览器跳转,仅构造重定向 response 对象;它只在 service worker 中 return 时生效,前端跳转应使用 window.location.href 等原生导航 api。

Fetch API 本身不支持在前端直接调用 Response.redirect() 实现真正的 HTTP 重定向(即类似服务端返回 302 状态码并跳转),因为该方法仅用于构造一个重定向类型的 Response 对象,**不会触发浏览器跳转**。它主要用在 Service Worker 中拦截请求并主动返回重定向响应,或在测试中模拟重定向行为。
Response.redirect() 是构造器,不是执行器
Response.redirect(url, status) 返回的是一个 Response 对象,状态码为 301、302、303、307 或 308(默认 302),body 为空,redirected 属性为 true。但它不会让当前页面跳转——这是关键误区。
- 在普通 fetch 调用中:
fetch(...).then(res => Response.redirect('https://example.com'))只是创建了一个响应对象,没任何副作用 - 在 Service Worker 的
fetch事件中:可 return 这个 redirect 响应,浏览器会按标准处理(如 302 → 发起新请求) - 在单元测试(如 Jest + Mock Service Worker)中:可用于模拟后端重定向响应
前端模拟重定向的正确方式
若目标是“用户点击后跳转到新 URL”,应直接使用浏览器原生导航 API:
-
window.location.href = 'https://example.com'—— 替换当前页(最常用) -
window.location.replace('https://example.com')—— 替换历史记录,无法后退 -
window.location.assign('https://example.com')—— 同href=效果 -
history.pushState()或history.replaceState()—— 单页应用中路由跳转(需配合前端路由库)
Service Worker 中真正使用 Response.redirect()
只有在 Service Worker 环境下,return 一个 redirect Response 才会产生实际重定向效果:
// sw.js
self.addEventListener('fetch', event => {
if (event.request.url.includes('/old-path')) {
event.respondWith(
Response.redirect('https://yoursite.com/new-path', 301)
);
}
});
此时浏览器收到 301 响应,自动发起对新 URL 的 GET 请求(符合 HTTP 规范)。
常见误用与调试建议
遇到“调用了 redirect 却没跳转”,先确认运行环境:
- 检查是否在 Service Worker 内 —— 普通 JS 脚本里无效
- 用
console.log(res.redirected)和res.status验证响应是否真为重定向类型 - 避免混淆:
fetch().then(res => res.redirect(...))是错误写法(res.redirect不存在) - 需要根据后端返回状态码做跳转?应在
fetch的then中判断res.status === 302,再手动调用location.href
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











