@@ -22,6 +22,14 @@ export interface MiddlewareOutputEvent {
22
22
origin : Origin | false ;
23
23
}
24
24
25
+ const staticRegexp = RoutesManifest . routes . static . map (
26
+ ( route ) => new RegExp ( route . regex ) ,
27
+ ) ;
28
+
29
+ const dynamicRegexp = RoutesManifest . routes . dynamic . map (
30
+ ( route ) => new RegExp ( route . regex ) ,
31
+ ) ;
32
+
25
33
export default async function routingHandler (
26
34
event : InternalEvent ,
27
35
) : Promise < InternalResult | MiddlewareOutputEvent > {
@@ -47,6 +55,8 @@ export default async function routingHandler(
47
55
internalEvent = middleware ;
48
56
}
49
57
58
+ // At this point internalEvent is an InternalEvent or a MiddlewareOutputEvent
59
+
50
60
let isExternalRewrite = middleware . externalRewrite ?? false ;
51
61
if ( ! isExternalRewrite ) {
52
62
// First rewrite to be applied
@@ -57,9 +67,11 @@ export default async function routingHandler(
57
67
internalEvent = beforeRewrites . internalEvent ;
58
68
isExternalRewrite = beforeRewrites . isExternalRewrite ;
59
69
}
60
- const isStaticRoute = RoutesManifest . routes . static . some ( ( route ) =>
61
- new RegExp ( route . regex ) . test ( event . rawPath ) ,
62
- ) ;
70
+ const isStaticRoute =
71
+ ! isExternalRewrite &&
72
+ staticRegexp . some ( ( route ) =>
73
+ route . test ( ( internalEvent as InternalEvent ) . rawPath ) ,
74
+ ) ;
63
75
64
76
if ( ! isStaticRoute && ! isExternalRewrite ) {
65
77
// Second rewrite to be applied
@@ -74,9 +86,11 @@ export default async function routingHandler(
74
86
// We want to run this just before the dynamic route check
75
87
internalEvent = handleFallbackFalse ( internalEvent , PrerenderManifest ) ;
76
88
77
- const isDynamicRoute = RoutesManifest . routes . dynamic . some ( ( route ) =>
78
- new RegExp ( route . regex ) . test ( event . rawPath ) ,
79
- ) ;
89
+ const isDynamicRoute =
90
+ ! isExternalRewrite &&
91
+ dynamicRegexp . some ( ( route ) =>
92
+ route . test ( ( internalEvent as InternalEvent ) . rawPath ) ,
93
+ ) ;
80
94
if ( ! isDynamicRoute && ! isStaticRoute && ! isExternalRewrite ) {
81
95
// Fallback rewrite to be applied
82
96
const fallbackRewrites = handleRewrites (
@@ -87,6 +101,41 @@ export default async function routingHandler(
87
101
isExternalRewrite = fallbackRewrites . isExternalRewrite ;
88
102
}
89
103
104
+ // Api routes are not present in the routes manifest except if they're not behind /api
105
+ // /api even if it's a page route doesn't get generated in the manifest
106
+ // Ideally we would need to properly check api routes here
107
+ const isApiRoute =
108
+ internalEvent . rawPath === "/api" ||
109
+ internalEvent . rawPath . startsWith ( "/api/" ) ;
110
+
111
+ const isRouteFoundBeforeAllRewrites =
112
+ isStaticRoute || isDynamicRoute || isExternalRewrite ;
113
+
114
+ // If we still haven't found a route, we show the 404 page
115
+ // We need to ensure that rewrites are applied before showing the 404 page
116
+ if (
117
+ ! isRouteFoundBeforeAllRewrites &&
118
+ ! isApiRoute &&
119
+ // We need to check again once all rewrites have been applied
120
+ ! staticRegexp . some ( ( route ) =>
121
+ route . test ( ( internalEvent as InternalEvent ) . rawPath ) ,
122
+ ) &&
123
+ ! dynamicRegexp . some ( ( route ) =>
124
+ route . test ( ( internalEvent as InternalEvent ) . rawPath ) ,
125
+ )
126
+ ) {
127
+ internalEvent = {
128
+ ...internalEvent ,
129
+ rawPath : "/404" ,
130
+ url : "/404" ,
131
+ headers : {
132
+ ...internalEvent . headers ,
133
+ "x-middleware-response-cache-control" :
134
+ "private, no-cache, no-store, max-age=0, must-revalidate" ,
135
+ } ,
136
+ } ;
137
+ }
138
+
90
139
// We apply the headers from the middleware response last
91
140
Object . entries ( {
92
141
...middlewareResponseHeaders ,
0 commit comments