Static assets ignore `next.config.js` `headers()` and middleware-set `Cache-Control`
#1 551 ouverte le 22 mai 2026
Métriques du dépôt
- Stars
- (8 563 étoiles)
- Métriques de merge PR
- (Merge moyen 1j 1h) (462 PRs mergées en 30 j)
Description
This issue was created by an agent analysing CI failures from the Next.js Deploy Suite (vinext
mainvs Next.jsv16.2.6, 2026-05-22).
Problem
Two related issues where static assets do not honor user-supplied Cache-Control: (1) when the user configures headers() in next.config.js to set Cache-Control: max-age=1234 for a static-asset path, vinext still returns the default public, max-age=0, must-revalidate; (2) middleware-set headers for static assets are dropped — vinext keeps the default cache-control even when middleware explicitly sets max-age=1234.
Expected: "max-age=1234" Received: "public, max-age=0, must-revalidate" (next.config headers)
Expected: "max-age=1234" Received: "public, max-age=0, must-revalidate" (middleware-set)
Estimated Impact
~2 test failures across the deploy suite.
Affected Test Suites
test/e2e/app-dir/no-duplicate-headers-next-config/no-duplicate-headers-next-config.test.tstest/e2e/app-dir/no-duplicate-headers-middleware/no-duplicate-headers-middleware.test.ts
Recommendation
-
Reproduce first in vinext's own test suite. Cover both cases:
headers()rule on a static-asset path, and middleware settingCache-Controlon a static-asset response. -
Consult the
headers()config when serving static assets. Runheaders()rule matching for_next/static/*and other static-asset paths. -
Allow middleware to override defaults. When middleware sets a header on a static-asset response, the middleware value must replace the default. Apply the precedence: middleware > config > default.
Part of #1328.