From fe496e1be82f6ad522413b34e2b56965dbaceb4d Mon Sep 17 00:00:00 2001 From: Alessio Pelliccione Date: Mon, 24 Nov 2025 17:22:07 +0100 Subject: [PATCH] fix(@angular/build): ensure external SSR middleware handles requests outside baseHref Move the `ExternalSsrMiddleware` registration to execute before Vite's internal middlewares. This fixes an issue where custom server routes (like `/health` or `/api`) were unreachable in development mode if the application used a specific `baseHref`, as Vite would filter them out before the SSR middleware could process them. Closes #31896 --- .../tools/vite/plugins/setup-middlewares-plugin.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/angular/build/src/tools/vite/plugins/setup-middlewares-plugin.ts b/packages/angular/build/src/tools/vite/plugins/setup-middlewares-plugin.ts index b82cc2d3acd6..181ae21e304d 100644 --- a/packages/angular/build/src/tools/vite/plugins/setup-middlewares-plugin.ts +++ b/packages/angular/build/src/tools/vite/plugins/setup-middlewares-plugin.ts @@ -105,15 +105,21 @@ export function createAngularSetupMiddlewaresPlugin( extensionMiddleware?.forEach((middleware) => server.middlewares.use(middleware)); + // For ExternalSsrMiddleware, install the middleware early to ensure custom middleware + // in server.ts can handle requests outside the base path (e.g., /ping when baseHref=/custom/) + // This allows fallthrough for custom routes that don't start with the configured baseHref + if (ssrMode === ServerSsrMode.ExternalSsrMiddleware) { + server.middlewares.use( + await createAngularSsrExternalMiddleware(server, indexHtmlTransformer), + ); + } + // Returning a function, installs middleware after the main transform middleware but // before the built-in HTML middleware // eslint-disable-next-line @typescript-eslint/no-misused-promises return async () => { + // ExternalSsrMiddleware was already installed above, skip here if (ssrMode === ServerSsrMode.ExternalSsrMiddleware) { - server.middlewares.use( - await createAngularSsrExternalMiddleware(server, indexHtmlTransformer), - ); - return; }