diff --git a/.changeset/fetch-prerendered-base.md b/.changeset/fetch-prerendered-base.md new file mode 100644 index 000000000000..87e2fa759ec8 --- /dev/null +++ b/.changeset/fetch-prerendered-base.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly detect prerendered paths in server `fetch` when `paths.base` is set diff --git a/packages/kit/src/runtime/server/fetch.js b/packages/kit/src/runtime/server/fetch.js index 6449516da63a..de8fe48c40e0 100644 --- a/packages/kit/src/runtime/server/fetch.js +++ b/packages/kit/src/runtime/server/fetch.js @@ -117,7 +117,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade return await fetch(request); } - if (has_prerendered_path(manifest, paths.base + decoded)) { + if (has_prerendered_path(manifest, decoded)) { // The path of something prerendered could match a different route // that is still in the manifest, leading to the wrong route being loaded. // We therefore bail early here. The prerendered logic is different for diff --git a/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.server.js b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.server.js new file mode 100644 index 000000000000..1e723e95221d --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.server.js @@ -0,0 +1,10 @@ +/** @type {import('./$types').PageServerLoad} */ +export async function load({ fetch }) { + const response = await fetch('/basepath/fetch-prerendered/shadowed/static'); + const text = await response.text(); + + return { + status: response.status, + found: text.includes('this page was prerendered') + }; +} diff --git a/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.svelte b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.svelte new file mode 100644 index 000000000000..bda45345d9ef --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.status} {data.found}

diff --git a/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/[...rest]/+page.svelte b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/[...rest]/+page.svelte new file mode 100644 index 000000000000..4056a6db1d02 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/[...rest]/+page.svelte @@ -0,0 +1 @@ +

catch-all

diff --git a/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.js b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.js new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.js @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.svelte b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.svelte new file mode 100644 index 000000000000..6be4c67d1ad9 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/fetch-prerendered/shadowed/static/+page.svelte @@ -0,0 +1 @@ +

this page was prerendered

diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 5c3e8e2304fe..21ab3a7a1fd5 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -61,6 +61,11 @@ test.describe('paths', () => { expect(new URL(page.url()).pathname).toBe('/basepath/hello'); }); + test('serves a prerendered page for a server-side fetch of its path', async ({ page }) => { + await page.goto('/basepath/fetch-prerendered'); + expect(await page.textContent('h1')).toBe('200 true'); + }); + test('query remote function from client accounts for base path', async ({ page, javaScriptEnabled