Skip to content

Commit 5c25087

Browse files
authored
Fix validateRSCRequestHeaders incorrect redirect (vercel#82119)
Found during dogfooding on Vercel that sometimes the RSC validation fails incorrectly. The root cause was that headers like `Next-Router-Prefetch` were absent from the header and transferred to request meta. Eventually we should improve how we retrieve these fields consistently.
1 parent 92d1f0d commit 5c25087

File tree

5 files changed

+16
-7
lines changed

5 files changed

+16
-7
lines changed

packages/next/src/server/base-server.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,9 +2013,18 @@ export default abstract class Server<
20132013
isRSCRequest
20142014
) {
20152015
const headers = req.headers
2016+
2017+
const isPrefetchRSCRequest =
2018+
headers[NEXT_ROUTER_PREFETCH_HEADER.toLowerCase()] ||
2019+
getRequestMeta(req, 'isPrefetchRSCRequest')
2020+
2021+
const segmentPrefetchRSCRequest =
2022+
headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER.toLowerCase()] ||
2023+
getRequestMeta(req, 'segmentPrefetchRSCRequest')
2024+
20162025
const expectedHash = computeCacheBustingSearchParam(
2017-
headers[NEXT_ROUTER_PREFETCH_HEADER.toLowerCase()],
2018-
headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER.toLowerCase()],
2026+
isPrefetchRSCRequest ? '1' : '0',
2027+
segmentPrefetchRSCRequest,
20192028
headers[NEXT_ROUTER_STATE_TREE_HEADER.toLowerCase()],
20202029
headers[NEXT_URL.toLowerCase()]
20212030
)

packages/next/src/shared/lib/router/utils/cache-busting-search-param.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { hexHash } from '../../hash'
22

33
export function computeCacheBustingSearchParam(
4-
prefetchHeader: string | string[] | undefined,
4+
prefetchHeader: '1' | '0' | undefined,
55
segmentPrefetchHeader: string | string[] | undefined,
66
stateTreeHeader: string | string[] | undefined,
77
nextUrlHeader: string | string[] | undefined
88
): string {
99
if (
10-
prefetchHeader === undefined &&
10+
(prefetchHeader === undefined || prefetchHeader === '0') &&
1111
segmentPrefetchHeader === undefined &&
1212
stateTreeHeader === undefined &&
1313
nextUrlHeader === undefined

test/e2e/app-dir/app-prefetch/prefetching.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ describe('app dir - prefetching', () => {
305305

306306
const url = new URL('/prefetch-auto/justputit', 'http://localhost')
307307
const cacheBustingParam = computeCacheBustingSearchParam(
308-
headers['Next-Router-Prefetch'],
308+
headers['Next-Router-Prefetch'] ? '1' : '0',
309309
undefined,
310310
headers['Next-Router-State-Tree'],
311311
headers['Next-Url']

test/e2e/app-dir/ppr-full/ppr-full.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const addCacheBustingSearchParam = (
5252
headers: Record<string, string | string[] | undefined>
5353
) => {
5454
const cacheKey = computeCacheBustingSearchParam(
55-
headers['Next-Router-Prefetch'],
55+
headers['Next-Router-Prefetch'] ? '1' : '0',
5656
headers['Next-Router-Segment-Prefetch'],
5757
headers['Next-Router-State-Tree'],
5858
headers['Next-URL']

test/e2e/app-dir/rewrite-headers/rewrite-headers.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ describe('rewrite-headers', () => {
418418
// Add cache busting param for RSC requests
419419
if (headers.RSC === '1') {
420420
const cacheBustingParam = computeCacheBustingSearchParam(
421-
headers['Next-Router-Prefetch'],
421+
headers['Next-Router-Prefetch'] ? '1' : '0',
422422
undefined,
423423
headers['Next-Router-State-Tree'],
424424
undefined

0 commit comments

Comments
 (0)