diff --git a/apps/docs/workers/app.ts b/apps/docs/workers/app.ts index 3983dcec..3ce3a7b5 100644 --- a/apps/docs/workers/app.ts +++ b/apps/docs/workers/app.ts @@ -14,8 +14,26 @@ const requestHandler = createRequestHandler( import.meta.env.MODE ); +const BASENAME = '/docs'; + export default { - fetch(request, env, ctx) { + async fetch(request, env, ctx) { + const url = new URL(request.url); + + // The app is built with base: '/docs', so HTML references assets at + // /docs/assets/... and /docs/*.webp, but the ASSETS binding only knows + // about the flat build/client/ layout. Re-fetch with the prefix stripped + // so static files resolve before we fall through to SSR. + if (url.pathname.startsWith(`${BASENAME}/`)) { + const strippedUrl = new URL(url); + strippedUrl.pathname = url.pathname.slice(BASENAME.length); + + const assetResponse = await env.ASSETS.fetch(new Request(strippedUrl, request)); + if (assetResponse.status !== 404) { + return assetResponse; + } + } + return requestHandler(request, { cloudflare: { env, ctx } }); diff --git a/apps/website/src/hooks.server.ts b/apps/website/src/hooks.server.ts new file mode 100644 index 00000000..3361e252 --- /dev/null +++ b/apps/website/src/hooks.server.ts @@ -0,0 +1,27 @@ +import type { Handle } from '@sveltejs/kit'; + +const DOCS_ORIGIN = 'https://cio-docs.digdippa.workers.dev'; + +export const handle: Handle = async ({ event, resolve }) => { + const { pathname } = event.url; + + if (pathname === '/docs' || pathname.startsWith('/docs/')) { + const upstream = new URL(pathname + event.url.search, DOCS_ORIGIN); + + const headers = new Headers(event.request.headers); + headers.delete('host'); + headers.set('x-forwarded-host', event.url.host); + headers.set('x-forwarded-proto', 'https'); + + const hasBody = event.request.method !== 'GET' && event.request.method !== 'HEAD'; + + return fetch(upstream, { + method: event.request.method, + headers, + body: hasBody ? event.request.body : undefined, + redirect: 'manual' + }); + } + + return resolve(event); +};