@@ -5,6 +5,19 @@ export interface FetchEventResult {
5
5
waitUntil : Promise < any >
6
6
}
7
7
8
+ /**
9
+ * This is how Next handles rewritten URLs.
10
+ */
11
+ export function relativizeURL ( url : string | string , base : string | URL ) {
12
+ const baseURL = typeof base === 'string' ? new URL ( base ) : base
13
+ const relative = new URL ( url , base )
14
+ const origin = `${ baseURL . protocol } //${ baseURL . host } `
15
+ return `${ relative . protocol } //${ relative . host } ` === origin
16
+ ? relative . toString ( ) . replace ( origin , '' )
17
+ : relative . toString ( )
18
+ }
19
+
20
+
8
21
export const addMiddlewareHeaders = async (
9
22
originResponse : Promise < Response > | Response ,
10
23
middlewareResponse : Response ,
@@ -14,7 +27,8 @@ export const addMiddlewareHeaders = async (
14
27
return originResponse
15
28
}
16
29
// We need to await the response to get the origin headers, then we can add the ones from middleware.
17
- const response = await originResponse
30
+ const res = await originResponse
31
+ const response = new Response ( res . body , res )
18
32
middlewareResponse . headers . forEach ( ( value , key ) => {
19
33
response . headers . set ( key , value )
20
34
} )
@@ -33,6 +47,14 @@ export const buildResponse = async ({
33
47
request . headers . set ( 'x-nf-next-middleware' , 'skip' )
34
48
const rewrite = res . headers . get ( 'x-middleware-rewrite' )
35
49
if ( rewrite ) {
50
+ const rewriteUrl = new URL ( rewrite , request . url )
51
+ const baseUrl = new URL ( request . url )
52
+ if ( rewriteUrl . hostname !== baseUrl . hostname ) {
53
+ // Netlify Edge Functions don't support proxying to external domains, but Next middleware does
54
+ const proxied = fetch ( new Request ( rewriteUrl . toString ( ) , request ) )
55
+ return addMiddlewareHeaders ( proxied , res )
56
+ }
57
+ res . headers . set ( 'x-middleware-rewrite' , relativizeURL ( rewrite , request . url ) )
36
58
return addMiddlewareHeaders ( context . rewrite ( rewrite ) , res )
37
59
}
38
60
if ( res . headers . get ( 'x-middleware-next' ) === '1' ) {
0 commit comments