fix: use nextUrl.clone() for middleware redirects to preserve basePath /ims

This commit is contained in:
2026-07-12 14:39:01 +08:00
parent c1c874b3fe
commit 706a075d73
+14 -4
View File
@@ -28,7 +28,8 @@ export async function middleware(request: NextRequest) {
const isSharedRoute = pathname.startsWith('/report') const isSharedRoute = pathname.startsWith('/report')
if (!user && !isPublicRoute) { if (!user && !isPublicRoute) {
const redirectUrl = new URL('/login', request.url) const redirectUrl = request.nextUrl.clone()
redirectUrl.pathname = '/login'
redirectUrl.searchParams.set('redirect', pathname + request.nextUrl.search) redirectUrl.searchParams.set('redirect', pathname + request.nextUrl.search)
return NextResponse.redirect(redirectUrl) return NextResponse.redirect(redirectUrl)
} }
@@ -36,11 +37,18 @@ export async function middleware(request: NextRequest) {
if (user && (pathname === '/' || pathname === '/login')) { if (user && (pathname === '/' || pathname === '/login')) {
const redirect = request.nextUrl.searchParams.get('redirect') const redirect = request.nextUrl.searchParams.get('redirect')
if (redirect && redirect.startsWith('/')) { if (redirect && redirect.startsWith('/')) {
return NextResponse.redirect(new URL(redirect, request.url)) const url = request.nextUrl.clone()
url.pathname = redirect
url.search = ''
return NextResponse.redirect(url)
} }
const { data: profile } = await supabase.from('users').select('role').eq('id', user.id).single() const { data: profile } = await supabase.from('users').select('role').eq('id', user.id).single()
const role = profile?.role const role = profile?.role
if (isValidRole(role)) return NextResponse.redirect(new URL(ROLE_HOME[role as UserRole], request.url)) if (isValidRole(role)) {
const url = request.nextUrl.clone()
url.pathname = ROLE_HOME[role as UserRole]
return NextResponse.redirect(url)
}
} }
if (user && !isPublicRoute && !isSharedRoute && pathname !== '/') { if (user && !isPublicRoute && !isSharedRoute && pathname !== '/') {
@@ -49,7 +57,9 @@ export async function middleware(request: NextRequest) {
if (isValidRole(role)) { if (isValidRole(role)) {
const allowedPrefix = ROLE_HOME[role as UserRole] const allowedPrefix = ROLE_HOME[role as UserRole]
if (!pathname.startsWith(allowedPrefix)) { if (!pathname.startsWith(allowedPrefix)) {
return NextResponse.redirect(new URL(allowedPrefix, request.url)) const url = request.nextUrl.clone()
url.pathname = allowedPrefix
return NextResponse.redirect(url)
} }
} }
} }