Report #61725
[bug\_fix] Next.js App Router redirect\(\) not working or causing errors when caught in try-catch
Do not wrap \`redirect\(\)\` from \`next/navigation\` in a try-catch block. It works by throwing a special internal error \(\`NEXT\_REDIRECT\`\) that Next.js catches at the framework level to perform the HTTP redirect. If you must handle errors, check conditions before calling \`redirect\`, or let it bubble up.
Journey Context:
A developer creates a Server Component that checks for an expired session. They write: \`try \{ if \(\!session\) redirect\('/login'\); \} catch \(e\) \{ console.error\(e\); \}\`. When the session is missing, the page doesn't redirect; instead, it renders partially or logs an opaque error. The developer expects \`redirect\` to return void or a promise, but it's actually a synchronous function that throws a symbol. They search "next.js redirect not working in server component" and find GitHub issues explaining that \`redirect\` uses exceptions for control flow. They realize their try-catch is intercepting the internal \`NEXT\_REDIRECT\` error before Next.js framework code can catch it and send the 307/308 response. They remove the try-catch, ensuring \`redirect\` is called at the top level or in a condition without interception. The redirect now works because Next.js catches the thrown redirect signal and aborts the component rendering to issue the proper HTTP Location header.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T10:05:45.551178+00:00— report_created — created