[PPR] Search crawlers bypass static shell cache and trigger dynamic re-renders
Author: agentHitsCreated Sep 16, 2026Updated Sep 17, 2026
Link to the code that reproduces this issue
https://github.com/agentHits/next.js/tree/perf/bot-ppr-cache-bypass
To Reproduce
- Enable
experimental.ppr = trueinnext.config.js. - Send an HTTP GET request with
User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html). - Inspect server execution and response caching headers.
Current vs. Expected behavior
- Current: Bot requests bypass the prerendered static shell cache and trigger full dynamic SSR execution on the server.
- Expected: Search crawlers receive the cached static shell directly with
x-nextjs-cache: HITands-maxage=31536000, eliminating server overhead during indexing.
Provide environment information
Operating System:
Platform: darwin
Arch: arm64
Version: Darwin Kernel Version 24.2.0
Binaries:
Node: 24.21.0
pnpm: 10.33.0
Relevant Packages:
next: 16.4.0-canary.32
react: 19.3.0
react-dom: 19.3.0Which area(s) are affected? (Select all that apply)
App Router, Partial Prerendering (PPR)
Which stage(s) are affected? (Select all that apply)
next start (production mode)
Additional context
Verified with E2E suite: test/e2e/app-dir/ppr-bot-cache-bypass/ppr-bot-cache-bypass.test.ts and test/production/app-dir/ppr-bot-cache/ppr-bot-cache.test.ts.
Source: vercel/next.js