From cad4edd5a396c447ad99f4016bc856e197c9d85b Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 11 May 2022 19:33:29 +0200 Subject: [PATCH] fix(nuxt): respect baseurl when redirecting (and universal router) (#4933) * fix(nuxt): respect baseurl when redirecting (and universal router) * test: add test case for redirect --- packages/nuxt/src/app/composables/router.ts | 5 +++-- packages/nuxt/src/app/plugins/router.ts | 5 +++-- test/basic.test.ts | 16 +++++++++++----- test/fixtures/basic/pages/navigate-to.vue | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/nuxt/src/app/composables/router.ts b/packages/nuxt/src/app/composables/router.ts index 3b2a10fded..2373f61a72 100644 --- a/packages/nuxt/src/app/composables/router.ts +++ b/packages/nuxt/src/app/composables/router.ts @@ -1,6 +1,7 @@ import type { Router, RouteLocationNormalizedLoaded, NavigationGuard, RouteLocationNormalized, RouteLocationRaw, NavigationFailure } from 'vue-router' import { sendRedirect } from 'h3' -import { useNuxtApp } from '#app' +import { joinURL } from 'ufo' +import { useNuxtApp, useRuntimeConfig } from '#app' export const useRouter = () => { return useNuxtApp()?.$router as Router @@ -66,7 +67,7 @@ export const navigateTo = (to: RouteLocationRaw, options: NavigateToOptions = {} if (process.server) { const nuxtApp = useNuxtApp() if (nuxtApp.ssrContext && nuxtApp.ssrContext.event) { - const redirectLocation = router.resolve(to).fullPath || '/' + const redirectLocation = joinURL(useRuntimeConfig().app.baseURL, router.resolve(to).fullPath || '/') return nuxtApp.callHook('app:redirected').then(() => sendRedirect(nuxtApp.ssrContext.event, redirectLocation, options.redirectCode || 301)) } } diff --git a/packages/nuxt/src/app/plugins/router.ts b/packages/nuxt/src/app/plugins/router.ts index 84b85dbd6c..641d21c507 100644 --- a/packages/nuxt/src/app/plugins/router.ts +++ b/packages/nuxt/src/app/plugins/router.ts @@ -1,5 +1,5 @@ import { reactive, h } from 'vue' -import { parseURL, parseQuery, withoutBase, isEqual } from 'ufo' +import { parseURL, parseQuery, withoutBase, isEqual, joinURL } from 'ufo' import { createError } from 'h3' import { defineNuxtPlugin } from '..' import { callWithNuxt } from '../nuxt' @@ -102,6 +102,7 @@ export default defineNuxtPlugin<{ route: Route, router: Router }>((nuxtApp) => { hooks[hook].push(guard) return () => hooks[hook].splice(hooks[hook].indexOf(guard), 1) } + const baseURL = useRuntimeConfig().app.baseURL const route: Route = reactive(getRouteFromPath(initialURL)) async function handleNavigation (url: string, replace?: boolean): Promise { @@ -124,7 +125,7 @@ export default defineNuxtPlugin<{ route: Route, router: Router }>((nuxtApp) => { // Perform navigation Object.assign(route, to) if (process.client) { - window.history[replace ? 'replaceState' : 'pushState']({}, '', url) + window.history[replace ? 'replaceState' : 'pushState']({}, '', joinURL(baseURL, url)) if (!nuxtApp.isHydrating) { // Clear any existing errors await callWithNuxt(nuxtApp, clearError) diff --git a/test/basic.test.ts b/test/basic.test.ts index 764e55bda7..2379b0baaa 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -148,12 +148,9 @@ describe('head tags', () => { describe('navigate', () => { it('should redirect to index with navigateTo', async () => { - const html = await $fetch('/navigate-to/') + const { headers } = await fetch('/navigate-to/', { redirect: 'manual' }) - // Snapshot - // expect(html).toMatchInlineSnapshot() - - expect(html).toContain('Hello Nuxt 3!') + expect(headers.get('location')).toEqual('/') }) }) @@ -368,6 +365,15 @@ describe('dynamic paths', () => { } }) + it('should use baseURL when redirecting', async () => { + process.env.NUXT_APP_BUILD_ASSETS_DIR = '/_other/' + process.env.NUXT_APP_BASE_URL = '/foo/' + await startServer() + const { headers } = await fetch('/foo/navigate-to/', { redirect: 'manual' }) + + expect(headers.get('location')).toEqual('/foo/') + }) + it('should allow setting CDN URL', async () => { process.env.NUXT_APP_BASE_URL = '/foo/' process.env.NUXT_APP_CDN_URL = 'https://example.com/' diff --git a/test/fixtures/basic/pages/navigate-to.vue b/test/fixtures/basic/pages/navigate-to.vue index 717569e2df..d1e96641c3 100644 --- a/test/fixtures/basic/pages/navigate-to.vue +++ b/test/fixtures/basic/pages/navigate-to.vue @@ -3,5 +3,5 @@