NextJS多租户应用中ISR按需重新验证失效问题排查
Next.js多租户应用按需静态重新验证失效问题解决
问题场景
基于Next.js Pages路由构建多租户应用,通过Middleware实现URL重写为子域名形式(如username.company.com),功能正常。用户生成内容页面位于pages/_sites/[site]/index.tsx和pages/_sites/[site]/[slug].tsx,采用getStaticPaths+getStaticProps在构建时静态生成,未开启自动重新验证,仅计划在用户更新内容时触发缓存清理。
按文档实现按需重新验证API后,调用时传入正确的实际路径(如/_sites/company/fullstack-developer/),但本地及Vercel部署环境(Next.js v13.4.13)中,手动触发重新验证始终无法刷新缓存,页面持续返回陈旧内容,必须重新构建才能生效。
问题原因
使用Next.js Middleware进行URL重写时,重新验证API的调用必须针对目标生效的主机名发起,而非默认的根域名。之前的调用未匹配到对应子域名的缓存上下文,导致重新验证未生效。
解决方案
调用重新验证API时,需确保请求发送到对应租户的子域名(如https://company.company.com/api/revalidate),而非根域名(如https://your-domain.com/api/revalidate)。这样才能让Next.js定位到对应子域名下的静态缓存资源并完成清理。
验证API代码
import type { NextApiRequest, NextApiResponse } from "next"; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { // 验证请求合法性 if (req.body.secret !== process.env.REVALIDATE_TOKEN) { return res.status(401).json({ message: "无效令牌" }); } try { // 传入实际文件路径(非重写后的子域名路径) await res.revalidate(req.body.url); return res.json({ revalidated: true }); } catch (err) { return res.status(500).send("重新验证失败"); } }
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

