You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用fetch()不跟随重定向且避免不透明响应?

能否使用fetch()不跟随重定向且不返回不透明响应?

可以实现,但要区分同域和跨域场景:

同域请求场景

使用redirect: "manual"时,同域请求的响应完全可以拿到真实的状态码(比如302)和重定向目标地址,不会返回不透明响应。你之前代码里status总是0,大概率是请求涉及跨域导致的浏览器安全限制。

正确的同域请求示例:

fetch("/submit", { redirect: "manual" })
  .then(response => {
    if (response.status === 302) {
      console.debug("检测到302重定向,目标地址:", response.headers.get("Location"));
      // 此处可判定请求成功(非5xx错误)
    } else if (response.ok) {
      console.debug("请求成功,无重定向");
    } else {
      console.debug("请求失败,状态码:", response.status);
    }
  })
  .catch(error => {
    console.error(error);
  });

跨域请求场景

如果是跨域请求,出于安全限制,浏览器会返回opaque-redirect类型的响应,此时status为0,无法获取真实状态码和重定向地址。这种情况下没法直接通过fetch检测重定向,可行的替代方案是:

  • 借助同域代理转发请求:前端请求自己的同域服务端,由服务端去请求跨域接口,再把完整的响应信息返回给前端
  • 提前和后端约定接口行为,通过其他标识判断是否触发重定向

内容的提问来源于stack exchange,提问作者hawk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:01