Next.js Edge Route部署至AWS/Vercel时出现405错误求助
解决Next.js Edge Route部署后405错误的方案
针对你遇到的本地正常、部署到AWS/Vercel出现405的问题,给你几个针对性的排查和修复方向:
1. 显式处理OPTIONS预检请求
浏览器发送POST跨域请求前会先发OPTIONS预检,虽然本地开发环境可能自动处理,但Edge Runtime部署环境需要显式响应。你的代码目前没有区分请求方法,导致OPTIONS请求可能被误处理,引发平台返回405。
修改服务端代码,优先处理OPTIONS:
export const config = { runtime: 'edge', }; export default async function handler(req: Request): Promise<Response> { const corsHeaders = { 'Access-Control-Allow-Origin': process.env.NEXT_PUBLIC_URL || '*', // 测试阶段可临时用*,验证后替换为实际域名 'Access-Control-Allow-Methods': 'POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type', }; // 处理OPTIONS预检,返回204无需内容 if (req.method === 'OPTIONS') { return new Response(null, { status: 204, headers: corsHeaders, }); } // 仅处理POST请求 if (req.method !== 'POST') { return new Response('Method Not Allowed', { status: 405, headers: { ...corsHeaders, 'Allow': 'POST, OPTIONS', }, }); } // 你的业务逻辑 const body = await req.json(); // ...处理逻辑 return new Response(JSON.stringify({ success: true, data: body }), { status: 200, headers: { ...corsHeaders, 'Content-Type': 'application/json', }, }); }
2. 验证部署环境变量
确保NEXT_PUBLIC_URL在部署平台(Vercel/AWS)中正确配置为前端的完整域名(例如https://your-app.vercel.app),空值会导致CORS头无效,浏览器拦截请求后表现为405。
3. 检查Edge Route的文件结构
- Next.js App Router(13+):Edge Route必须放在
app/api/[route-name]/route.ts - Next.js Pages Router:必须放在
pages/api/[route-name].ts
错误的文件位置会导致平台无法识别路由,返回404或405。
4. 直接用curl测试API
跳过浏览器的CORS限制,用curl直接调用部署后的API,确认请求是否真的到达你的代码:
curl -v -X POST https://your-domain/api/your-route \ -H "Content-Type: application/json" \ -d '{"key": "value"}'
查看返回的状态码和响应头,如果是405,检查平台日志(Vercel Functions日志、AWS Lambda@Edge日志),确认请求是否被Edge层拦截。
5. 排查平台额外配置
- Vercel:检查是否在
vercel.json中配置了重写/重定向规则,是否影响了API路由 - AWS:检查Lambda@Edge的触发条件、CloudFront的缓存策略或WAF规则,是否阻止了POST请求
内容的提问来源于stack exchange,提问作者kysclient
相关产品推荐
相关产品推荐

