diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index df801b9ac549d..e25a46be08e71 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -3067,6 +3067,7 @@ export default abstract class Server< }, { routeKind: RouteKind.PAGES, + isRscRequest: isRSCRequest, incrementalCache, isRoutePPREnabled, isFallback: true, @@ -3101,6 +3102,7 @@ export default abstract class Server< }), { routeKind: RouteKind.APP_PAGE, + isRscRequest: isRSCRequest, incrementalCache, isRoutePPREnabled, isFallback: true, @@ -3173,6 +3175,7 @@ export default abstract class Server< // rendered and thus check isAppPath. routeModule?.definition.kind ?? (isAppPath ? RouteKind.APP_PAGE : RouteKind.PAGES), + isRscRequest: isRSCRequest, incrementalCache, isOnDemandRevalidate, isPrefetch: req.headers.purpose === 'prefetch', diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 26e8b2d88a924..8e910b352cd9b 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -1047,6 +1047,7 @@ export default class NextNodeServer extends BaseServer< }, { routeKind: RouteKind.IMAGE, + isRscRequest: false, incrementalCache: imageOptimizerCache, isFallback: false, } diff --git a/packages/next/src/server/response-cache/index.ts b/packages/next/src/server/response-cache/index.ts index 7c48b0361ef66..af7158158bfbf 100644 --- a/packages/next/src/server/response-cache/index.ts +++ b/packages/next/src/server/response-cache/index.ts @@ -53,6 +53,7 @@ export default class ResponseCache implements ResponseCacheBase { responseGenerator: ResponseGenerator, context: { routeKind: RouteKind + isRscRequest: boolean isOnDemandRevalidate?: boolean isPrefetch?: boolean incrementalCache: IncrementalResponseCache @@ -198,6 +199,8 @@ export default class ResponseCache implements ResponseCacheBase { } ) - return toResponseCacheEntry(response) + return toResponseCacheEntry(response, { + isRscRequest: context.isRscRequest, + }) } } diff --git a/packages/next/src/server/response-cache/types.ts b/packages/next/src/server/response-cache/types.ts index 08a0d5ee23519..d7ed8b5d494e2 100644 --- a/packages/next/src/server/response-cache/types.ts +++ b/packages/next/src/server/response-cache/types.ts @@ -17,6 +17,7 @@ export interface ResponseCacheBase { * provided it will test the filesystem to check. */ routeKind: RouteKind + isRscRequest: boolean /** * True if this is a fallback request. diff --git a/packages/next/src/server/response-cache/utils.ts b/packages/next/src/server/response-cache/utils.ts index 5d965cf3ee182..b1368fd22105d 100644 --- a/packages/next/src/server/response-cache/utils.ts +++ b/packages/next/src/server/response-cache/utils.ts @@ -9,6 +9,7 @@ import { import RenderResult from '../render-result' import { RouteKind } from '../route-kind' +import { RedirectStatusCode } from '../../client/components/redirect-status-code' export async function fromResponseCacheEntry( cacheEntry: ResponseCacheEntry @@ -39,7 +40,8 @@ export async function fromResponseCacheEntry( } export async function toResponseCacheEntry( - response: IncrementalResponseCacheEntry | null + response: IncrementalResponseCacheEntry | null, + { isRscRequest }: { isRscRequest: boolean } ): Promise { if (!response) return null @@ -62,7 +64,14 @@ export async function toResponseCacheEntry( html: RenderResult.fromStatic(response.value.html), rscData: response.value.rscData, headers: response.value.headers, - status: response.value.status, + status: + // RSC redirect is embedded in the payload itself and handled by client router directly + // This makes it consistent with how it's handled in minimalMode + isRscRequest && + response.value.status && + RedirectStatusCode[response.value.status] + ? 200 + : response.value.status, postponed: response.value.postponed, segmentData: response.value.segmentData, } satisfies CachedAppPageValue)