Skip to content

Commit d498f9c

Browse files
Jude Gaoijjkztanner
authored
Fix router.refresh missing canonical url override (vercel#65999)
Fixes vercel#65970 ---- The browser update happens at https://github.com/vercel/next.js/blob/10d5c278bc0e9eab067df7b5f3943c12ab54a6a9/packages/next/src/client/components/app-router.tsx#L685, which sets the browser location to `canonicalUrl`. `canonicalUrl` was correctly set at https://github.com/vercel/next.js/blob/ab03c3261f53fcff1fb3387673cfd170a626564c/packages/next/src/client/components/router-reducer/reducers/refresh-reducer.ts#L98, but then mistakenly overriden at https://github.com/vercel/next.js/blob/51549d92de3069b6dc5cd1f5fcdc04d5b1cbf37a/packages/next/src/client/components/router-reducer/reducers/refresh-reducer.ts#L129. This PR fixes that and includes an E2E test to prevent future regression. --------- Co-authored-by: JJ Kasper <jj@jjsweb.site> Co-authored-by: Zack Tanner <1939140+ztanner@users.noreply.github.com>
1 parent b6a72f3 commit d498f9c

File tree

7 files changed

+59
-1
lines changed

7 files changed

+59
-1
lines changed

packages/next/src/client/components/router-reducer/reducers/refresh-reducer.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ export function refreshReducer(
126126

127127
mutable.cache = cache
128128
mutable.patchedTree = newTree
129-
mutable.canonicalUrl = href
130129

131130
currentTree = newTree
132131
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { NextResponse } from 'next/server'
2+
3+
export function POST() {
4+
const res = NextResponse.json({ message: 'successful' })
5+
res.cookies.set('token', 'this is a token')
6+
return res
7+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
'use client'
2+
3+
import { useRouter } from 'next/navigation'
4+
import { useEffect } from 'react'
5+
6+
export default function Reload() {
7+
const router = useRouter()
8+
9+
useEffect(() => {
10+
fetch(new URL('/api/set-token', location.origin), {
11+
method: 'POST',
12+
credentials: 'include',
13+
}).then(() => {
14+
router.refresh()
15+
})
16+
}, [router])
17+
18+
return null
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import Reload from './Reload'
2+
3+
export default function Page() {
4+
return (
5+
<div>
6+
Authenticated, now reloading...
7+
<Reload />
8+
</div>
9+
)
10+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function Page() {
2+
return <p>Dashboard</p>
3+
}

test/e2e/app-dir/navigation/middleware.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,13 @@ export function middleware(request) {
2121
if (request.nextUrl.pathname === '/redirect-middleware-to-dashboard') {
2222
return NextResponse.redirect(new URL('/redirect-dest', request.url))
2323
}
24+
25+
if (request.nextUrl.pathname === '/redirect-on-refresh/auth') {
26+
const cookie = request.cookies.get('token')
27+
if (cookie) {
28+
return NextResponse.redirect(
29+
new URL('/redirect-on-refresh/dashboard', request.url)
30+
)
31+
}
32+
}
2433
}

test/e2e/app-dir/navigation/navigation.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,4 +909,15 @@ describe('app dir - navigation', () => {
909909
})
910910
})
911911
})
912+
913+
describe('middleware redirect', () => {
914+
it('should change browser location when router.refresh() gets a redirect response', async () => {
915+
const browser = await next.browser('/redirect-on-refresh/auth')
916+
await retry(async () =>
917+
expect(await browser.url()).toBe(
918+
next.url + '/redirect-on-refresh/dashboard'
919+
)
920+
)
921+
})
922+
})
912923
})

0 commit comments

Comments
 (0)