diff options
Diffstat (limited to 'packages/integrations/netlify/src')
-rw-r--r-- | packages/integrations/netlify/src/index.ts | 9 | ||||
-rw-r--r-- | packages/integrations/netlify/src/ssr-function.ts | 7 |
2 files changed, 12 insertions, 4 deletions
diff --git a/packages/integrations/netlify/src/index.ts b/packages/integrations/netlify/src/index.ts index d6dcc353f..e634c4ecc 100644 --- a/packages/integrations/netlify/src/index.ts +++ b/packages/integrations/netlify/src/index.ts @@ -105,13 +105,14 @@ export default function netlifyIntegration( } } - async function writeSSRFunction() { + async function writeSSRFunction(notFoundContent?: string) { await writeFile( new URL('./ssr.mjs', ssrOutputDir()), ` import createSSRHandler from './entry.mjs'; export default createSSRHandler(${JSON.stringify({ cacheOnDemandPages: Boolean(integrationConfig?.cacheOnDemandPages), + notFoundContent, })}); export const config = { name: "Astro SSR", generator: "@astrojs/netlify@${packageVersion}", path: "/*", preferStatic: true }; ` @@ -300,7 +301,11 @@ export default function netlifyIntegration( logger.info('Emitted _redirects'); if (_config.output !== 'static') { - await writeSSRFunction(); + let notFoundContent = undefined; + try { + notFoundContent = await readFile(new URL('./404.html', dir), 'utf8'); + } catch {} + await writeSSRFunction(notFoundContent); logger.info('Generated SSR Function'); } diff --git a/packages/integrations/netlify/src/ssr-function.ts b/packages/integrations/netlify/src/ssr-function.ts index d0a963bde..33aea2717 100644 --- a/packages/integrations/netlify/src/ssr-function.ts +++ b/packages/integrations/netlify/src/ssr-function.ts @@ -13,11 +13,14 @@ const clientAddressSymbol = Symbol.for('astro.clientAddress'); export const createExports = (manifest: SSRManifest, _args: Args) => { const app = new App(manifest); - function createHandler(integrationConfig: { cacheOnDemandPages: boolean }) { + function createHandler(integrationConfig: { cacheOnDemandPages: boolean, notFoundContent?: string }) { return async function handler(request: Request, context: Context) { const routeData = app.match(request); - Reflect.set(request, clientAddressSymbol, context.ip); + if (!routeData && typeof integrationConfig.notFoundContent !== 'undefined') { + return new Response(integrationConfig.notFoundContent, { status: 404 }); + } + Reflect.set(request, clientAddressSymbol, context.ip); let locals: Record<string, unknown> = {}; const astroLocalsHeader = request.headers.get('x-astro-locals'); |