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
相关产品推荐
相关产品推荐

