Next.js 13按需重验证端点报308 API错误求助
Next.js 13按需重验证报错
Error: Invalid response 308 at DevServer.revalidate的解决方案 这个308错误的核心原因是重定向触发——你的App Router使用了多语言[locale]动态路由,调用response.revalidate()时传入的路径没有匹配带locale前缀的完整路由,导致Next.js自动发起locale重定向返回308,但revalidate方法不接受重定向响应,因此报错。
具体解决步骤:
确保传入的path包含完整locale前缀
调用重验证接口时,path参数必须是带locale的完整路径(比如/en/pages),而非/pages这类不带locale的路径。如果触发请求时传递的路径缺少locale,Next.js会自动跳转到带默认locale的路由,返回308导致revalidate失败。修正路径格式并做兜底处理
在revalidation.ts里添加路径格式校验,确保路径以斜杠开头,且包含locale前缀:import { NextApiRequest, NextApiResponse } from 'next'; export default async function handler( request: NextApiRequest, response: NextApiResponse ) { if (request.query.secret !== process.env.NEXT_REVALIDATION_TOKEN) { return response.status(401).json({ message: 'Invalid token.' }); } let { path } = request.query; if (!path) { return response.status(400).json({ message: 'Path parameter is required.' }); } // 确保路径以斜杠开头 let validPath = (path as string).startsWith('/') ? path as string : `/${path}`; // 自动拼接默认locale(如果路径未包含) const defaultLocale = process.env.NEXT_PUBLIC_DEFAULT_LOCALE || 'en'; if (!validPath.startsWith(`/${defaultLocale}`)) { validPath = `/${defaultLocale}${validPath}`; } try { await response.revalidate(validPath); return response.status(200).json({ revalidated: true, path: validPath }); } catch (err) { return response.status(500).json({ message: 'Revalidation failed', error: (err as Error).message }); } }排查额外重定向规则
检查pages.tsx或项目中的middleware.ts是否存在自定义重定向逻辑,这类规则会导致revalidate请求触发重定向,返回308错误。手动测试验证
用curl直接调用接口测试,确认完整路径是否有效:curl "http://localhost:3000/api/revalidation?secret=你的验证令牌&path=/en/pages"
注:你的项目混合了App Router与Pages Router,这种模式Next.js 13是支持的,但在Pages Router的API路由中调用revalidate时,必须严格匹配App Router里的实际路由(包含所有动态参数,比如这里的[locale])。
内容的提问来源于stack exchange,提问作者John williams
相关产品推荐
相关产品推荐

