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

Vercel部署Next.js中间件报EDGE_FUNCTION_INVOCATION_FAILED错误

问题根因

该报错并非Vercel平台侧故障,本质是中间件代码在Edge Runtime运行环境下存在未做容错的逻辑,触发了运行时异常:

  • Vercel平台上Next.js的Middleware默认运行在Edge Runtime,和本地开发的Node.js运行时行为存在差异:req.referrer属性不会在所有请求中存在,当请求未携带Referer请求头时,该值为undefined,直接调用.includes()方法会抛出类型错误,最终导致Edge函数调用失败,返回500状态码与EDGE_FUNCTION_INVOCATION_FAILED错误码。
  • 本地开发阶段测试的请求均携带了Referer头,未触发该异常,因此会出现本地运行正常、线上部署报错的现象。
  • 额外说明:直接读取req.referrer并非Next.js Middleware推荐的请求头获取方式,Edge Runtime下部分场景中该属性不会被正确填充。
代码修复方案

调整中间件代码,增加空值容错,同时改用标准的请求头读取方式获取Referer,修正后可直接在Vercel平台正常运行:

import { NextResponse } from 'next/server';

export function middleware(req) {
  // 从标准请求头读取Referer,设置空字符串兜底避免undefined调用方法报错
  const referrer = req.headers.get('referer') || '';
  if (referrer.includes('x-domain')) {
    // 处理路径拼接时的重复斜杠问题
    const redirectPath = req.nextUrl.pathname.startsWith('/') ? req.nextUrl.pathname.slice(1) : req.nextUrl.pathname;
    const redirect_url = `https://x-domain/${redirectPath}`;
    // 明确指定302状态码,符合临时重定向场景
    return NextResponse.redirect(redirect_url, { status: 302 });
  }
  return NextResponse.next();
}

// 配置路由匹配规则,避免中间件在静态资源、API路由等不需要的路径触发
export const config = {
  matcher: [
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
};
更高稳定性的替代方案

如果不需要在重定向逻辑中加入复杂判断,可以直接使用Vercel原生路由配置实现重定向,不需要运行Edge函数,稳定性和性能都更优:
在项目根目录新建/修改vercel.json,添加如下重定向规则:

{
  "redirects": [
    {
      "source": "/:path*",
      "has": [
        {
          "type": "header",
          "key": "referer",
          "value": ".*x-domain.*"
        }
      ],
      "destination": "https://x-domain/:path*",
      "permanent": false
    }
  ]
}

该配置会在Vercel边缘网络层直接完成请求判断和重定向,不会出现函数运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:42:18