diff --git a/packages/libs/lambda-at-edge/src/default-handler.ts b/packages/libs/lambda-at-edge/src/default-handler.ts index 40449b8001..3a843aeee7 100644 --- a/packages/libs/lambda-at-edge/src/default-handler.ts +++ b/packages/libs/lambda-at-edge/src/default-handler.ts @@ -297,7 +297,7 @@ const handleOriginRequest = async ({ } } - const isStaticPage = pages.html.nonDynamic[uri]; + const isStaticPage = pages.html.nonDynamic[uri]; // plain page without any props const isPrerenderedPage = prerenderManifest.routes[uri]; // prerendered pages are also static pages like "pages.html" above, but are defined in the prerender-manifest const origin = request.origin as CloudFrontOrigin; const s3Origin = origin.s3 as CloudFrontS3Origin; @@ -328,7 +328,9 @@ const handleOriginRequest = async ({ s3Origin.domainName = normalisedS3DomainName; S3Check: if ( + // Note: public files and static pages (HTML pages with no props) don't have JS files needed for preview mode, always serve from S3. isPublicFile || + isStaticPage || (isHTMLPage && !isPreviewRequest) || (hasFallback && !isPreviewRequest) || (isDataReq && !isPreviewRequest) diff --git a/packages/libs/lambda-at-edge/tests/default-handler/default-handler.test.ts b/packages/libs/lambda-at-edge/tests/default-handler/default-handler.test.ts index 169f9f9ec1..a9e0928b05 100644 --- a/packages/libs/lambda-at-edge/tests/default-handler/default-handler.test.ts +++ b/packages/libs/lambda-at-edge/tests/default-handler/default-handler.test.ts @@ -224,6 +224,39 @@ describe("Lambda@Edge", () => { expect(decodedBody).toBe("pages/preview.js"); expect(response.status).toBe(200); }); + + it("HTML page without any props served from S3 on preview mode", async () => { + const event = createCloudFrontEvent({ + uri: `/terms${trailingSlash ? "/" : ""}`, + host: "mydistribution.cloudfront.net", + requestHeaders: { + cookie: [ + { + key: "Cookie", + value: "__next_preview_data=abc; __prerender_bypass=def" + } + ] + } + }); + + const result = await handler(event); + + const request = result as CloudFrontRequest; + + expect(request.origin).toEqual({ + s3: { + authMethod: "origin-access-identity", + domainName: "my-bucket.s3.amazonaws.com", + path: "/static-pages", + region: "us-east-1" + } + }); + expect(request.uri).toEqual("/terms.html"); + expect(request.headers.host[0].key).toEqual("host"); + expect(request.headers.host[0].value).toEqual( + "my-bucket.s3.amazonaws.com" + ); + }); }); describe("Public files routing", () => {