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

NextJS 13中rewrites无法在getServerSideProps中代理API请求

解决Next.js 13 getServerSideProps中rewrites代理不生效的问题

问题原因

Next.js的rewrites配置只负责处理外部客户端请求(比如浏览器发起的/api/*请求)和内部路由跳转,而getServerSideProps运行在Node.js服务端环境,这里发起的HTTP请求属于服务端内部调用,不会经过rewrites的路由代理规则。

当你在服务端用相对路径/api/get_page_data时,Axios会默认把请求发向当前Next.js服务器的地址(比如http://localhost:3000/api/get_page_data),而非你配置的代理目标地址,自然返回404错误。

解决方案

方案1:用环境变量区分客户端/服务端请求地址(推荐)

  1. 在项目根目录创建.env.local文件,配置API地址:
# 客户端用的地址(走rewrites代理)
NEXT_PUBLIC_API_CLIENT_BASE=/api
# 服务端直接请求的目标API地址
API_SERVER_BASE=http://test.example.com/api
  1. 封装Axios实例,自动切换baseURL:
import axios from 'axios';

// 判断当前是否为服务端环境
const isServer = typeof window === 'undefined';

// 创建Axios实例,根据环境自动切换baseURL
const apiClient = axios.create({
  baseURL: isServer ? process.env.API_SERVER_BASE : process.env.NEXT_PUBLIC_API_CLIENT_BASE,
});

export async function getData() {
  // 直接使用相对路径,Axios会自动拼接对应baseURL
  const res = await apiClient.get('/get_page_data');
  return res.data;
}

这样客户端请求会走/api触发rewrites代理,服务端则直接请求目标API地址,两边都能正常工作。

方案2:手动在请求中区分地址

如果不想用环境变量,也可以直接在getData函数里判断环境切换URL:

import axios from 'axios';

export async function getData() {
  const requestUrl = typeof window === 'undefined'
    ? 'http://test.example.com/api/get_page_data'
    : '/api/get_page_data';

  const res = await axios.get(requestUrl);
  return res.data;
}

验证效果

修改后,getServerSideProps里的prefetchQuery调用会直接请求目标API地址,客户端请求则走rewrites代理,不会再出现404错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:31