diff --git a/packages/vue-app/template/utils.js b/packages/vue-app/template/utils.js index 67ddb25cb3..3aff9e9dfa 100644 --- a/packages/vue-app/template/utils.js +++ b/packages/vue-app/template/utils.js @@ -597,6 +597,10 @@ function formatUrl (url, query) { let result = (protocol ? protocol + '://' : '//') + parts.shift() let path = parts.join('/') + if (path === '' && parts.length === 1) { + result += '/' + } + let hash parts = path.split('#') if (parts.length === 2) { diff --git a/test/dev/basic.ssr.test.js b/test/dev/basic.ssr.test.js index 328ac3337a..b2a47737a2 100644 --- a/test/dev/basic.ssr.test.js +++ b/test/dev/basic.ssr.test.js @@ -152,24 +152,9 @@ describe('basic ssr', () => { expect(html).toContain('

Index page

') }) - test('/redirect', async () => { - const { html, redirected } = await nuxt.server.renderRoute('/redirect') - expect(html).toContain('
') - expect(html).not.toContain('window.__NUXT__') - expect(redirected.path === '/').toBe(true) - expect(redirected.status === 302).toBe(true) - }) - - test('/redirect -> check redirected source', async () => { - // there are no transition properties in jsdom, ignore the error log - const window = await nuxt.server.renderAndGetWindow(url('/redirect')) - const html = window.document.body.innerHTML - expect(html).toContain('

Index page

') - }) - - test('/redirect -> external link', async () => { + describe('/redirect', () => { let _headers, _status - const { html } = await nuxt.server.renderRoute('/redirect-external', { + const renderContext = { res: { writeHead (status, headers) { _status = status @@ -177,10 +162,43 @@ describe('basic ssr', () => { }, end () { } } + } + + test('/redirect', async () => { + const { html, redirected } = await nuxt.server.renderRoute('/redirect') + expect(html).toContain('
') + expect(html).not.toContain('window.__NUXT__') + expect(redirected.path === '/').toBe(true) + expect(redirected.status === 302).toBe(true) + }) + + test('/redirect -> check redirected source', async () => { + // there are no transition properties in jsdom, ignore the error log + const window = await nuxt.server.renderAndGetWindow(url('/redirect')) + const html = window.document.body.innerHTML + expect(html).toContain('

Index page

') + }) + + test('/redirect -> external link', async () => { + const { html } = await nuxt.server.renderRoute('/redirect-external', renderContext) + expect(_status).toBe(302) + expect(_headers.Location).toBe('https://nuxtjs.org/api/') + expect(html).toContain('
') + }) + + test('/redirect -> external link without trailing slash', async () => { + const { html } = await nuxt.server.renderRoute('/redirect-external-no-slash', renderContext) + expect(_status).toBe(302) + expect(_headers.Location).toBe('https://nuxtjs.org/api') + expect(html).toContain('
') + }) + + test('/redirect -> external link with root domain url', async () => { + const { html } = await nuxt.server.renderRoute('/redirect-external-root', renderContext) + expect(_status).toBe(302) + expect(_headers.Location).toBe('https://nuxtjs.org/') + expect(html).toContain('
') }) - expect(_status).toBe(302) - expect(_headers.Location).toBe('https://nuxtjs.org') - expect(html).toContain('
') }) test('/special-state -> check window.__NUXT__.test = true', async () => { diff --git a/test/e2e/basic.browser.test.js b/test/e2e/basic.browser.test.js index cd519122cb..6998fb0296 100644 --- a/test/e2e/basic.browser.test.js +++ b/test/e2e/basic.browser.test.js @@ -261,7 +261,7 @@ describe('basic browser', () => { await page.nuxt.navigate('/redirect-external', false) await page.waitForFunction( - () => window.location.href === 'https://nuxtjs.org/' + () => window.location.href === 'https://nuxtjs.org/api/' ) page.close() }) diff --git a/test/fixtures/basic/pages/redirect-external-no-slash.vue b/test/fixtures/basic/pages/redirect-external-no-slash.vue new file mode 100644 index 0000000000..cdd8cd9474 --- /dev/null +++ b/test/fixtures/basic/pages/redirect-external-no-slash.vue @@ -0,0 +1,11 @@ + + + diff --git a/test/fixtures/basic/pages/redirect-external-root.vue b/test/fixtures/basic/pages/redirect-external-root.vue new file mode 100644 index 0000000000..a1c712cb64 --- /dev/null +++ b/test/fixtures/basic/pages/redirect-external-root.vue @@ -0,0 +1,11 @@ + + + diff --git a/test/fixtures/basic/pages/redirect-external.vue b/test/fixtures/basic/pages/redirect-external.vue index a1c712cb64..c2177fd153 100644 --- a/test/fixtures/basic/pages/redirect-external.vue +++ b/test/fixtures/basic/pages/redirect-external.vue @@ -5,7 +5,7 @@