From ea30dad0a4fc98a198f2321e64a6a5ef0dad573d Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 9 Feb 2024 12:56:14 +0100 Subject: [PATCH 1/4] chore: add failing test --- cypress/e2e/middleware/standard.cy.ts | 7 +++++++ demos/middleware/middleware.ts | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/cypress/e2e/middleware/standard.cy.ts b/cypress/e2e/middleware/standard.cy.ts index 4992e0186c..587c5a2923 100644 --- a/cypress/e2e/middleware/standard.cy.ts +++ b/cypress/e2e/middleware/standard.cy.ts @@ -24,6 +24,13 @@ describe('Standard middleware', () => { cy.url().should('eq', `${Cypress.config().baseUrl}/shows/rewrite-external`) }) + it('doesnt follow redirects from rewritten page', () => { + cy.request({ url: '/rewrite-to-redirect', followRedirect: false }).then((response) => { + expect(response.status).to.eq(302) + expect(response.redirectedToUrl).to.eq('https://example.com') + }) + }) + it('adds headers to static pages', () => { cy.request('/shows/static/3').then((response) => { expect(response.headers).to.have.property('x-middleware-date') diff --git a/demos/middleware/middleware.ts b/demos/middleware/middleware.ts index 04f894b042..1530660371 100644 --- a/demos/middleware/middleware.ts +++ b/demos/middleware/middleware.ts @@ -38,6 +38,10 @@ export async function middleware(req: NextRequest) { return res } + if (pathname.startsWith("/rewrite-to-redirect")) { + return NextResponse.rewrite('https://httpbin.org/redirect-to?url=https://example.com') + } + // skipMiddlewareUrlNormalize next config option is used so we have to try to match both html path and data blob path if (pathname.startsWith('/request-rewrite') || pathname.endsWith('/request-rewrite.json')) { // request.rewrite() should return the MiddlewareResponse object instead of the Response object. From f6b8d0e003fc1089b5b01e5bb2a1ecb0ba833eb8 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 9 Feb 2024 13:03:43 +0100 Subject: [PATCH 2/4] fix: dont resolve redirects --- packages/runtime/src/templates/edge-shared/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index 70a2752192..7890addaad 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -265,7 +265,7 @@ export const buildResponse = async ({ } if (rewriteUrl.hostname !== baseUrl.hostname) { // Netlify Edge Functions don't support proxying to external domains, but Next middleware does - const proxied = fetch(new Request(rewriteUrl.toString(), request)) + const proxied = fetch(new Request(rewriteUrl.toString(), request), { redirect: 'manual' }) return addMiddlewareHeaders(proxied, res) } res.headers.set('x-middleware-rewrite', relativeUrl) From bbf5f27cfa201a3d0de305e9794d3fed54948903 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 9 Feb 2024 13:09:16 +0100 Subject: [PATCH 3/4] fix: run middleware on /rewrite-to-redirect --- demos/middleware/middleware.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/demos/middleware/middleware.ts b/demos/middleware/middleware.ts index 1530660371..1b1805ea95 100644 --- a/demos/middleware/middleware.ts +++ b/demos/middleware/middleware.ts @@ -178,6 +178,7 @@ export const config = { '/cookies/:path*', { source: '/static' }, { source: '/request-rewrite' }, + { source: '/rewrite-to-redirect' }, { source: '/matcher-cookie' }, { source: '/shows/((?!99|88).*)' }, { From 9901170cb3561018072ef2c3404ae70c1d701bfc Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 9 Feb 2024 13:17:36 +0100 Subject: [PATCH 4/4] fix: don't miss the trailing slash! --- cypress/e2e/middleware/standard.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/middleware/standard.cy.ts b/cypress/e2e/middleware/standard.cy.ts index 587c5a2923..79d9630532 100644 --- a/cypress/e2e/middleware/standard.cy.ts +++ b/cypress/e2e/middleware/standard.cy.ts @@ -27,7 +27,7 @@ describe('Standard middleware', () => { it('doesnt follow redirects from rewritten page', () => { cy.request({ url: '/rewrite-to-redirect', followRedirect: false }).then((response) => { expect(response.status).to.eq(302) - expect(response.redirectedToUrl).to.eq('https://example.com') + expect(response.redirectedToUrl).to.eq('https://example.com/') }) })