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

NextJS13服务端组件在Vercel部署时如何切换Fetch请求主机名?

解决Next.js 13服务端组件fetch主机名环境切换问题

下面是几个实用的方案,不用折腾复杂配置就能搞定:

方案1:利用Vercel默认环境变量+本地配置

Vercel部署时会自动给项目注入VERCEL_URL环境变量,值就是部署后的域名(比如your-pj-and-git-branch.vercel.app)。本地开发时,在项目根目录创建.env.local文件,手动定义这个变量:

VERCEL_URL=localhost:3000

然后在服务端组件里这样写fetch:

// 根据环境拼接基础URL
const baseUrl = process.env.VERCEL_URL 
  ? `https://${process.env.VERCEL_URL}` 
  : 'http://localhost:3000';

// 发起请求
const res = await fetch(`${baseUrl}/api/test`);

注:Vercel的VERCEL_URL不带协议头,所以部署环境要加https://,本地用http://。

方案2:直接获取当前请求的主机名(推荐)

在Next.js 13的服务端组件里,可以通过next/headers提供的headers()函数拿到当前请求的host头,这样不管是本地还是任何部署环境,都自动用当前的主机名,完全不用配置环境变量:

import { headers } from 'next/headers';

async function YourServerComponent() {
  const host = headers().get('host');
  // 开发环境用http,生产环境用https
  const baseUrl = process.env.NODE_ENV === 'development' 
    ? `http://${host}` 
    : `https://${host}`;

  const res = await fetch(`${baseUrl}/api/test`);
  // 处理响应逻辑...
}

这个方案特别适合调用同域名下的Next.js API路由,完全不用关心部署环境的域名变化。

方案3:自定义全局环境变量

如果需要更灵活的配置(比如API域名和前端域名不同),可以自定义一个环境变量:

  1. 本地根目录创建.env.local,添加:
NEXT_PUBLIC_API_BASE_URL=http://localhost:3000
  1. 登录Vercel控制台,找到你的项目,进入「Settings」→「Environment Variables」,给每个分支添加对应的变量值,比如分支环境填https://your-pj-and-git-branch.vercel.app。

然后代码里直接用这个变量:

const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/test`);

内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:03:22