Capítulo 29 de 456
Next.js define headers Cache-Control padrão que CDNs podem respeitar para cachear na borda, mas variabilidade de resposta baseada em headers customizados (rsc, next-router-state-tree, etc.) torna o cacheamento em CDN não-trivial hoje. A direção futura é cache-key baseado em pathname, eliminando essa dependência.
Cache-Control por estratégia de renderização: Static usa s-maxage=31536000; ISR usa s-maxage={revalidate}, stale-while-revalidate={expire-revalidate}; Dynamic usa private, no-cache, no-store, max-age=0, must-revalidate.revalidateTag()/revalidatePath() só invalida o cache do servidor Next.js, não a CDN; é preciso disparar purge da CDN (HTML e variante RSC) junto._rsc search parameter: hash dos headers relevantes que atua como cache-key, garantindo variantes de resposta corretas mesmo em CDNs que ignoram Vary.Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, next-url (só em rotas com intercepting routes).rsc obrigatório: se a CDN remover esse header, o servidor devolve HTML quando o client-side router esperava payload RSC, quebrando navegação client-side./my/page.rsc, /my/page.segments/.../segment.segment.rsc), permitindo dropar search params com segurança e eliminar necessidade de suporte a Vary.| Tipo de rota | Cache-Control |
|---|---|
| Static (sem revalidação) | s-maxage=31536000 |
| ISR (revalidação temporal) | s-maxage={revalidate}, stale-while-revalidate={expire-revalidate} |
| Dynamic | private, no-cache, no-store, max-age=0, must-revalidate |
Static assets (/_next/static/) | public, max-age=31536000, immutable |
| Header | Pode ignorar? | Consequência se ignorado |
|---|---|---|
next-router-state-tree | Sim (não-prefetch) | Servidor retorna payload completo em vez de update segmentado |
next-router-segment-prefetch | Sim | Fallback pra prefetch payload mais amplo |
next-url | Sim | Intercepting routes não funcionam; usuário vê navegação normal |
rsc | Não | Quebra navegação client-side (HTML servido onde RSC era esperado) |
next-router-prefetch + _rsc | Não, juntos | _rsc é discriminador obrigatório de cache-busting em prefetch |
_rsc precisa estar na cache key, senão variantes de resposta (HTML vs RSC) colidem no cache.proxy.js atrás da CDN sem bypass configurado: proxy deve rodar antes do cache da CDN pra continuar sendo fonte de verdade de auth/redirects/rewrites.revalidateTag/revalidatePath para atualizar CDN: eles só invalidam o cache do Next.js; sem purge de CDN, a borda continua servindo versão antiga até o s-maxage expirar.experimental.validateRSCRequestHeaders sem entender o efeito: por padrão, request RSC com _rsc errado recebe 307 redirect pra hash correto; desabilitar remove essa proteção.revalidateTag/revalidatePath.rsc é o único realmente obrigatório de preservar; os demais degradam graciosamente se ignorados._rsc na cache key e respeitando Cache-Control.Vary ou headers customizados.rsc/next-router-* que a CDN precisa lidar.