diff --git a/packages/next/server/dev/next-dev-server.ts b/packages/next/server/dev/next-dev-server.ts index ce87caa9f6ae..cb23b707bedb 100644 --- a/packages/next/server/dev/next-dev-server.ts +++ b/packages/next/server/dev/next-dev-server.ts @@ -540,9 +540,16 @@ export default class DevServer extends Server { return result } catch (error) { this.logErrorWithOriginalStack(error, undefined, 'client') + + const preflight = + params.request.method === 'HEAD' && + params.request.headers['x-middleware-preflight'] + if (preflight) throw error + const err = getProperError(error) ;(err as any).middleware = true const { request, response, parsedUrl } = params + response.statusCode = 500 this.renderError(err, request, response, parsedUrl.pathname) return null } diff --git a/packages/next/shared/lib/router/router.ts b/packages/next/shared/lib/router/router.ts index da481f225bcb..804f18a0d67c 100644 --- a/packages/next/shared/lib/router/router.ts +++ b/packages/next/shared/lib/router/router.ts @@ -1880,11 +1880,20 @@ export default class Router implements BaseRouter { return { type: 'next' } } - const preflight = await this._getPreflightData({ - preflightHref: options.as, - shouldCache: options.cache, - isPreview: options.isPreview, - }) + let preflight: PreflightData | undefined + try { + preflight = await this._getPreflightData({ + preflightHref: options.as, + shouldCache: options.cache, + isPreview: options.isPreview, + }) + } catch (err) { + // If preflight request fails, we need to do a hard-navigation. + return { + type: 'redirect', + destination: options.as, + } + } if (preflight.rewrite) { // for external rewrites we need to do a hard navigation diff --git a/test/integration/middleware/core/pages/errors/_middleware.js b/test/integration/middleware/core/pages/errors/_middleware.js new file mode 100644 index 000000000000..39f8795f4976 --- /dev/null +++ b/test/integration/middleware/core/pages/errors/_middleware.js @@ -0,0 +1,14 @@ +import { NextResponse } from 'next/server' + +export async function middleware(request) { + const url = request.nextUrl + + if ( + url.pathname === '/errors/throw-on-preflight' && + request.headers.has('x-middleware-preflight') + ) { + throw new Error('test error') + } + + return NextResponse.next() +} diff --git a/test/integration/middleware/core/pages/errors/index.js b/test/integration/middleware/core/pages/errors/index.js new file mode 100644 index 000000000000..4c740edb43a9 --- /dev/null +++ b/test/integration/middleware/core/pages/errors/index.js @@ -0,0 +1,11 @@ +import Link from 'next/link' + +export default function Errors() { + return ( +
{message}
+