From 1cfc68b2a708fd6e3e16e2f8240974dcf7ea684c Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Mon, 24 Jun 2024 20:19:05 +0200 Subject: [PATCH 1/8] fix: ensure we dont have multiple protocal forward slashes --- packages/open-next/src/core/routing/matcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/src/core/routing/matcher.ts b/packages/open-next/src/core/routing/matcher.ts index 50e8aba5d..a892550c7 100644 --- a/packages/open-next/src/core/routing/matcher.ts +++ b/packages/open-next/src/core/routing/matcher.ts @@ -216,7 +216,7 @@ export function handleRewrites( rewrittenQuery = unescapeRegex(toDestinationQuery(params)); } rewrittenUrl = isExternalRewrite - ? `${protocol}//${rewrittenHost}${rewrittenPath}` + ? `${protocol}${rewrittenHost}${rewrittenPath}` : `/${rewrittenPath}`; // Should we merge the query params or use only the ones from the rewrite? finalQuery = { From 2ae9a8dc1728efb3ceae497858a0049d36b3c58f Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Mon, 24 Jun 2024 20:20:01 +0200 Subject: [PATCH 2/8] chore: add changelog --- .changeset/fast-moles-joke.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fast-moles-joke.md diff --git a/.changeset/fast-moles-joke.md b/.changeset/fast-moles-joke.md new file mode 100644 index 000000000..448ee131a --- /dev/null +++ b/.changeset/fast-moles-joke.md @@ -0,0 +1,5 @@ +--- +"open-next": patch +--- + +Fix incorrect redirects to different domains From 9019bf6a44c616ff33217373b3ac28c6f4f7f6a7 Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Mon, 24 Jun 2024 21:19:52 +0200 Subject: [PATCH 3/8] fix: ensure protocol is returned without the forward slashes --- packages/open-next/src/core/routing/matcher.ts | 2 +- packages/open-next/src/core/routing/util.ts | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/open-next/src/core/routing/matcher.ts b/packages/open-next/src/core/routing/matcher.ts index a892550c7..50e8aba5d 100644 --- a/packages/open-next/src/core/routing/matcher.ts +++ b/packages/open-next/src/core/routing/matcher.ts @@ -216,7 +216,7 @@ export function handleRewrites( rewrittenQuery = unescapeRegex(toDestinationQuery(params)); } rewrittenUrl = isExternalRewrite - ? `${protocol}${rewrittenHost}${rewrittenPath}` + ? `${protocol}//${rewrittenHost}${rewrittenPath}` : `/${rewrittenPath}`; // Should we merge the query params or use only the ones from the rewrite? finalQuery = { diff --git a/packages/open-next/src/core/routing/util.ts b/packages/open-next/src/core/routing/util.ts index d2bcb88df..f82005f98 100644 --- a/packages/open-next/src/core/routing/util.ts +++ b/packages/open-next/src/core/routing/util.ts @@ -27,13 +27,10 @@ export function isExternal(url?: string, host?: string) { export function convertFromQueryString(query: string) { if (query === "") return {}; const queryParts = query.split("&"); - return queryParts.reduce( - (acc, part) => { - const [key, value] = part.split("="); - return { ...acc, [key]: value }; - }, - {} as Record, - ); + return queryParts.reduce((acc, part) => { + const [key, value] = part.split("="); + return { ...acc, [key]: value }; + }, {} as Record); } /** @@ -52,13 +49,13 @@ export function getUrlParts(url: string, isExternal: boolean) { }; } - const regex = /^(https?:\/\/)?([^\/\s]+)(\/[^?]*)?(\?.*)?/; + const regex = /^(https?:)\/\/?([^\/\s]+)(\/[^?]*)?(\?.*)?/; const match = url.match(regex); if (!match) { throw new Error(`Invalid external URL: ${url}`); } return { - protocol: match[1] ?? "https://", + protocol: match[1] ?? "https:", hostname: match[2], pathname: match[3], queryString: match[4]?.slice(1) ?? "", From 1d3a1e7de9eda27f976853acdebfb417f9765673 Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Mon, 24 Jun 2024 21:23:26 +0200 Subject: [PATCH 4/8] fix: style issues --- packages/open-next/src/core/routing/util.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/open-next/src/core/routing/util.ts b/packages/open-next/src/core/routing/util.ts index f82005f98..829265f74 100644 --- a/packages/open-next/src/core/routing/util.ts +++ b/packages/open-next/src/core/routing/util.ts @@ -27,10 +27,13 @@ export function isExternal(url?: string, host?: string) { export function convertFromQueryString(query: string) { if (query === "") return {}; const queryParts = query.split("&"); - return queryParts.reduce((acc, part) => { - const [key, value] = part.split("="); - return { ...acc, [key]: value }; - }, {} as Record); + return queryParts.reduce( + (acc, part) => { + const [key, value] = part.split("="); + return { ...acc, [key]: value }; + }, + {} as Record, + ); } /** From 2967bc9a03b3f3318151e96038d0ca112e9b546d Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Tue, 25 Jun 2024 08:26:08 +0200 Subject: [PATCH 5/8] chore: add e2e configuration --- examples/app-router/next.config.js | 7 +++++++ examples/pages-router/next.config.js | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/examples/app-router/next.config.js b/examples/app-router/next.config.js index d35b9fc21..fdbd5fcc8 100644 --- a/examples/app-router/next.config.js +++ b/examples/app-router/next.config.js @@ -51,6 +51,13 @@ const nextConfig = { permanent: true, has: [{ type: "cookie", key: "from", value: "wrongvalue" }], }, + { + source: "/redirect", + destination: "https://open-next.js.org/", + permanent: false, + basePath: false, + locale: false, + }, ]; }, headers() { diff --git a/examples/pages-router/next.config.js b/examples/pages-router/next.config.js index a0a5044b8..a93f7c6d6 100644 --- a/examples/pages-router/next.config.js +++ b/examples/pages-router/next.config.js @@ -22,6 +22,15 @@ const nextConfig = { ], }, ], + redirects: [ + { + source: "/redirect", + destination: "https://open-next.js.org/", + permanent: false, + basePath: false, + locale: false, + }, + ], trailingSlash: true, }; From 9b94eaa02a9c13c630bb7be82ad942d2a65b25b6 Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Tue, 25 Jun 2024 08:28:38 +0200 Subject: [PATCH 6/8] chore: add e2e test --- packages/tests-e2e/tests/pagesRouter/redirect.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/tests-e2e/tests/pagesRouter/redirect.test.ts diff --git a/packages/tests-e2e/tests/pagesRouter/redirect.test.ts b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts new file mode 100644 index 000000000..5d70e4d40 --- /dev/null +++ b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from "@playwright/test"; + +test("Single redirect", async ({ page }) => { + await page.goto("/redirect"); + + let el = page.getByText("Open source Next.js adapter"); + await expect(el).toBeVisible(); +}); From c273b0acb785890360b37520ae9bf1cade056b2b Mon Sep 17 00:00:00 2001 From: Jan Stevens Date: Thu, 27 Jun 2024 11:42:16 +0200 Subject: [PATCH 7/8] fix: use different redirect url which does not match middleware urls --- examples/app-router/next.config.js | 2 +- examples/pages-router/next.config.js | 2 +- packages/tests-e2e/tests/pagesRouter/redirect.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/app-router/next.config.js b/examples/app-router/next.config.js index fdbd5fcc8..8eef18d5e 100644 --- a/examples/app-router/next.config.js +++ b/examples/app-router/next.config.js @@ -52,7 +52,7 @@ const nextConfig = { has: [{ type: "cookie", key: "from", value: "wrongvalue" }], }, { - source: "/redirect", + source: "/next-config-redirect-without-locale-support", destination: "https://open-next.js.org/", permanent: false, basePath: false, diff --git a/examples/pages-router/next.config.js b/examples/pages-router/next.config.js index a93f7c6d6..ea80bd8ce 100644 --- a/examples/pages-router/next.config.js +++ b/examples/pages-router/next.config.js @@ -24,7 +24,7 @@ const nextConfig = { ], redirects: [ { - source: "/redirect", + source: "/next-config-redirect-without-locale-support", destination: "https://open-next.js.org/", permanent: false, basePath: false, diff --git a/packages/tests-e2e/tests/pagesRouter/redirect.test.ts b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts index 5d70e4d40..8b38dc9b4 100644 --- a/packages/tests-e2e/tests/pagesRouter/redirect.test.ts +++ b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts @@ -1,7 +1,7 @@ import { expect, test } from "@playwright/test"; test("Single redirect", async ({ page }) => { - await page.goto("/redirect"); + await page.goto("/next-config-redirect-without-locale-support/"); let el = page.getByText("Open source Next.js adapter"); await expect(el).toBeVisible(); From 31665dc967362b41c8bbe5b46fe036e75d76258b Mon Sep 17 00:00:00 2001 From: Dorseuil Nicolas Date: Thu, 27 Jun 2024 17:10:06 +0200 Subject: [PATCH 8/8] fix e2e --- examples/pages-router/next.config.js | 4 ++-- packages/tests-e2e/tests/pagesRouter/redirect.test.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/pages-router/next.config.js b/examples/pages-router/next.config.js index ea80bd8ce..16724adbd 100644 --- a/examples/pages-router/next.config.js +++ b/examples/pages-router/next.config.js @@ -22,9 +22,9 @@ const nextConfig = { ], }, ], - redirects: [ + redirects: () => [ { - source: "/next-config-redirect-without-locale-support", + source: "/next-config-redirect-without-locale-support/", destination: "https://open-next.js.org/", permanent: false, basePath: false, diff --git a/packages/tests-e2e/tests/pagesRouter/redirect.test.ts b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts index 8b38dc9b4..2937fd378 100644 --- a/packages/tests-e2e/tests/pagesRouter/redirect.test.ts +++ b/packages/tests-e2e/tests/pagesRouter/redirect.test.ts @@ -3,6 +3,7 @@ import { expect, test } from "@playwright/test"; test("Single redirect", async ({ page }) => { await page.goto("/next-config-redirect-without-locale-support/"); - let el = page.getByText("Open source Next.js adapter"); + await page.waitForURL("https://open-next.js.org/"); + let el = page.getByRole("heading", { name: "Open source Next.js adapter" }); await expect(el).toBeVisible(); });