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 @@
+
+ Redirecting...
+
+
+
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 @@
+
+ Redirecting...
+
+
+
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 @@