cloudflare/vinext

Static assets ignore `next.config.js` `headers()` and middleware-set `Cache-Control`

已关闭

#1,551 创建于 2026年5月22日

 (0 条评论) (0 个反应) (0 位负责人)TypeScript (371 个派生)github user discovery
adapter-api-e2ehelp wanted

仓库指标

星标
 (8,563 个星标)
PR 合并指标
 (平均合并 1天 1小时) (30 天内合并 462 个 PR)

描述

This issue was created by an agent analysing CI failures from the Next.js Deploy Suite (vinext main vs Next.js v16.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.ts
  • test/e2e/app-dir/no-duplicate-headers-middleware/no-duplicate-headers-middleware.test.ts

Recommendation

  1. Reproduce first in vinext's own test suite. Cover both cases: headers() rule on a static-asset path, and middleware setting Cache-Control on a static-asset response.

  2. Consult the headers() config when serving static assets. Run headers() rule matching for _next/static/* and other static-asset paths.

  3. 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.

贡献者指南