From f5a3d7968c43c103e82463a855bd2ca0e7046317 Mon Sep 17 00:00:00 2001 From: Mathieu Magalhaes Date: Thu, 16 Feb 2023 18:26:15 +0100 Subject: [PATCH] fix(nuxt): respect redirects which differ only by trailing slash (#18593) Co-authored-by: Daniel Roe --- packages/nuxt/src/pages/runtime/plugins/router.ts | 2 +- test/basic.test.ts | 10 +++++++++- test/fixtures/basic/middleware/redirect.global.ts | 5 +++++ test/fixtures/basic/pages/navigate-to.vue | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/nuxt/src/pages/runtime/plugins/router.ts b/packages/nuxt/src/pages/runtime/plugins/router.ts index 8fd3e9b388..80ed21c936 100644 --- a/packages/nuxt/src/pages/runtime/plugins/router.ts +++ b/packages/nuxt/src/pages/runtime/plugins/router.ts @@ -176,7 +176,7 @@ export default defineNuxtPlugin(async (nuxtApp) => { })]) } else if (process.server) { const currentURL = to.fullPath || '/' - if (!isEqual(currentURL, initialURL)) { + if (!isEqual(currentURL, initialURL, { trailingSlash: true })) { const event = await callWithNuxt(nuxtApp, useRequestEvent) const options = { redirectCode: event.node.res.statusCode !== 200 ? event.node.res.statusCode || 302 : 302 } await callWithNuxt(nuxtApp, navigateTo, [currentURL, options]) diff --git a/test/basic.test.ts b/test/basic.test.ts index 740ad15e3a..c098ad5ac2 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -321,9 +321,17 @@ describe('legacy async data', () => { describe('navigate', () => { it('should redirect to index with navigateTo', async () => { - const { headers } = await fetch('/navigate-to/', { redirect: 'manual' }) + const { headers, status } = await fetch('/navigate-to/', { redirect: 'manual' }) expect(headers.get('location')).toEqual('/') + expect(status).toEqual(301) + }) + + it('respects redirects + headers in middleware', async () => { + const res = await fetch('/navigate-some-path/', { redirect: 'manual', headers: { 'trailing-slash': 'true' } }) + expect(res.headers.get('location')).toEqual('/navigate-some-path') + expect(res.status).toEqual(307) + expect(await res.text()).toMatchInlineSnapshot('""') }) }) diff --git a/test/fixtures/basic/middleware/redirect.global.ts b/test/fixtures/basic/middleware/redirect.global.ts index a3cd7a824a..028b05a635 100644 --- a/test/fixtures/basic/middleware/redirect.global.ts +++ b/test/fixtures/basic/middleware/redirect.global.ts @@ -1,5 +1,10 @@ +import { withoutTrailingSlash } from 'ufo' + export default defineNuxtRouteMiddleware(async (to) => { const nuxtApp = useNuxtApp() + if (useRequestHeaders(['trailing-slash'])['trailing-slash'] && to.fullPath.endsWith('/')) { + return navigateTo(withoutTrailingSlash(to.fullPath), { redirectCode: 307 }) + } if (to.path.startsWith('/redirect/')) { await new Promise(resolve => setTimeout(resolve, 100)) return navigateTo(to.path.slice('/redirect/'.length - 1)) diff --git a/test/fixtures/basic/pages/navigate-to.vue b/test/fixtures/basic/pages/navigate-to.vue index d1e96641c3..f06b1c4182 100644 --- a/test/fixtures/basic/pages/navigate-to.vue +++ b/test/fixtures/basic/pages/navigate-to.vue @@ -3,5 +3,5 @@