From 85bad9f2886b04863a1c7c1048a47b6a0240df0b Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Mon, 6 Mar 2023 15:21:00 -0500 Subject: [PATCH 1/3] always add trailing slash to base path - fixes #9341 --- .changeset/great-stingrays-flash.md | 5 ++++ .../kit/src/runtime/server/page/render.js | 23 +++++++------------ packages/kit/src/runtime/server/respond.js | 4 +++- packages/kit/test/apps/options-2/test/test.js | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 .changeset/great-stingrays-flash.md diff --git a/.changeset/great-stingrays-flash.md b/.changeset/great-stingrays-flash.md new file mode 100644 index 000000000000..19b89c84c35a --- /dev/null +++ b/.changeset/great-stingrays-flash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use correct relative paths when rendering base path diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 22be19737272..1be57f7743fd 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -97,21 +97,14 @@ export async function render_response({ if (paths.relative !== false && !state.prerendering?.fallback) { const segments = event.url.pathname.slice(paths.base.length).split('/'); - if (segments.length === 1 && paths.base !== '') { - // if we're on `/my-base-path`, relative links need to start `./my-base-path` rather than `.` - base = `./${paths.base.split('/').at(-1)}`; - - base_expression = `new URL(${s(base)}, location).pathname`; - } else { - base = - segments - .slice(2) - .map(() => '..') - .join('/') || '.'; - - // resolve e.g. '../..' against current location, then remove trailing slash - base_expression = `new URL(${s(base)}, location).pathname.slice(0, -1)`; - } + base = + segments + .slice(2) + .map(() => '..') + .join('/') || '.'; + + // resolve e.g. '../..' against current location, then remove trailing slash + base_expression = `new URL(${s(base)}, location).pathname.slice(0, -1)`; if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) { assets = base; diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 0707898dff72..36cc09cf89b9 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -172,7 +172,9 @@ export async function respond(request, options, manifest, state) { try { // determine whether we need to redirect to add/remove a trailing slash if (route && !is_data_request) { - if (route.page) { + if (url.pathname === base || url.pathname === base + '/') { + trailing_slash = 'always'; + } else if (route.page) { const nodes = await Promise.all([ // we use == here rather than === because [undefined] serializes as "[null]" ...route.page.layouts.map((n) => (n == undefined ? n : manifest._.nodes[n]())), diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 31520020b8f0..baf3038d3f41 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -27,7 +27,7 @@ test.describe('paths', () => { test('uses relative paths during SSR', async ({ page, javaScriptEnabled }) => { await page.goto('/basepath'); - let base = javaScriptEnabled ? '/basepath' : './basepath'; + let base = javaScriptEnabled ? '/basepath' : '.'; expect(await page.textContent('[data-testid="base"]')).toBe(`base: ${base}`); expect(await page.textContent('[data-testid="assets"]')).toBe(`assets: ${base}`); From 4dff41b4f32298271797407de9335be3e44b2386 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Mon, 6 Mar 2023 15:40:02 -0500 Subject: [PATCH 2/3] tidy up --- packages/kit/src/runtime/server/page/render.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 1be57f7743fd..d330001c47a1 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -95,13 +95,9 @@ export async function render_response({ // if appropriate, use relative paths for greater portability if (paths.relative !== false && !state.prerendering?.fallback) { - const segments = event.url.pathname.slice(paths.base.length).split('/'); + const segments = event.url.pathname.slice(paths.base.length).split('/').slice(2); - base = - segments - .slice(2) - .map(() => '..') - .join('/') || '.'; + base = segments.map(() => '..').join('/') || '.'; // resolve e.g. '../..' against current location, then remove trailing slash base_expression = `new URL(${s(base)}, location).pathname.slice(0, -1)`; From 445b2a8b36e42114cb11c218b33ef8b631d9573d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 11 Apr 2023 09:40:45 -0400 Subject: [PATCH 3/3] Update packages/kit/src/runtime/server/respond.js --- packages/kit/src/runtime/server/respond.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 36cc09cf89b9..972dc85629ae 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -172,6 +172,8 @@ export async function respond(request, options, manifest, state) { try { // determine whether we need to redirect to add/remove a trailing slash if (route && !is_data_request) { + // if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`, + // regardless of the `trailingSlash` route option if (url.pathname === base || url.pathname === base + '/') { trailing_slash = 'always'; } else if (route.page) {