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

在Next.js中如何在axios拦截器中实现页面重定向?

解决方案

核心思路

SSR 场景下 axios 拦截器无法直接访问 Next.js 的服务端请求上下文,不能直接修改服务端响应实现重定向。因此调整逻辑:拦截器只负责抛出带重定向标识的错误,把重定向操作放到能接触到 Next.js 原生能力的上层(getServerSideProps、服务端组件等)执行。

具体实现步骤

步骤1:修改响应错误处理器

不要在拦截器内尝试服务端重定向,改为给错误对象挂载重定向相关标识:

// responseErrorHandler.ts
const responseErrorHandler = (error: AxiosError): Promise<AxiosError> => {
  if (error.response) {
    if (error.message === TIMEOUT_MESSAGE) {
      if (typeof window === 'undefined') {
        // 给错误对象挂载重定向标识,供上层逻辑识别
        (error as any).shouldRedirect = true
        (error as any).redirectUrl = '/503'
      } else {
        // 客户端逻辑保持不变,直接跳转
        window.location.href = '/503';
      }
    }
  }

  return Promise.reject(error);
}

步骤2:在上层请求位置处理重定向

Pages Router 场景

在 getServerSideProps 中捕获请求错误,识别到重定向标识后返回 Next.js 要求的重定向结构即可:

// pages/对应页面.tsx
export const getServerSideProps = async () => {
  try {
    const res = await customAxios.get('你的请求接口地址')
    return { 
      props: { 
        data: res.data 
      } 
    }
  } catch (err: any) {
    // 识别拦截器抛出的重定向信号
    if (err.shouldRedirect) {
      return {
        redirect: {
          destination: err.redirectUrl,
          permanent: false
        }
      }
    }
    // 其他错误的处理逻辑
    return { notFound: true }
  }
}

App Router 场景

在服务端组件/Server Action 中捕获错误,调用 Next.js 提供的 redirect 方法即可:

// app/对应路由/page.tsx
import { redirect } from 'next/navigation'

// 服务端请求逻辑
async function fetchPageData() {
  try {
    const res = await customAxios.get('你的请求接口地址')
    return res.data
  } catch (err: any) {
    if (err.shouldRedirect) {
      // 直接调用Next.js原生重定向方法
      redirect(err.redirectUrl)
    }
    throw err
  }
}

export default async function Page() {
  const data = await fetchPageData()
  return <div>{/* 页面渲染逻辑 */}</div>
}

进阶优化:封装通用请求函数

如果项目内请求较多,不想每个请求都重复写捕获逻辑,可以封装通用的请求包装函数:

// customAxios.ts
export const request = async <T = any>(config: AxiosRequestConfig): Promise<T> => {
  try {
    const res = await customAxios.request<T>(config)
    return res.data
  } catch (err: any) {
    // 服务端场景下直接抛出带标识的错误,上层统一处理
    if (typeof window === 'undefined' && err.shouldRedirect) {
      throw err
    }
    return Promise.reject(err)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:02