diff --git a/.changeset/lemon-comics-jump.md b/.changeset/lemon-comics-jump.md new file mode 100644 index 000000000000..f2c9255f3928 --- /dev/null +++ b/.changeset/lemon-comics-jump.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix 404 response leading to an infinite loop when there is no 404 page. diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index f58d248a35f7..f387d07a4fab 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -259,7 +259,7 @@ export async function handleRoute({ await writeWebResponse(incomingResponse, response); } } else { - if (result.status === 404) { + if (result.status === 404 && has404Route(manifestData)) { const fourOhFourRoute = await matchRoute('/404', env, manifestData); return handleRoute({ ...options, @@ -380,3 +380,7 @@ function getStatus(matchedRoute?: MatchedRoute): 404 | 500 | undefined { if (matchedRoute.route.route === '/404') return 404; if (matchedRoute.route.route === '/500') return 500; } + +function has404Route(manifest: ManifestData): RouteData | undefined { + return manifest.routes.find((route) => route.route === '/404') +}