From 44718567d8c495f30a8e9ec620db0ca1298c4fbb Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Tue, 7 Mar 2023 09:55:34 -0500 Subject: [PATCH] return 308s instead of 301s when normalising paths - fixes #9350 --- .changeset/dirty-pianos-try.md | 5 +++++ packages/kit/src/runtime/server/respond.js | 2 +- packages/kit/test/apps/options/test/test.js | 13 ++++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 .changeset/dirty-pianos-try.md diff --git a/.changeset/dirty-pianos-try.md b/.changeset/dirty-pianos-try.md new file mode 100644 index 000000000000..1a83f174870f --- /dev/null +++ b/.changeset/dirty-pianos-try.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use 308 responses for trailing slash redirects, instead of 301s diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 0707898dff72..13d89588adca 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -213,7 +213,7 @@ export async function respond(request, options, manifest, state) { if (normalized !== url.pathname && !state.prerendering?.fallback) { return new Response(undefined, { - status: 301, + status: 308, headers: { 'x-sveltekit-normalize': '1', location: diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index d50125ae8c7b..4228c128c0d9 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -1,3 +1,4 @@ +import * as http from 'node:http'; import { expect } from '@playwright/test'; import { test } from '../../../utils.js'; @@ -172,7 +173,17 @@ test.describe('env', () => { }); test.describe('trailingSlash', () => { - test('adds trailing slash', async ({ baseURL, page, clicknav }) => { + test.only('adds trailing slash', async ({ baseURL, page, clicknav }) => { + // we can't use Playwright's `request` here, because it resolves redirects + const status = await new Promise((fulfil, reject) => { + const request = http.get(`${baseURL}/path-base/slash`); + request.on('error', reject); + request.on('response', (response) => { + fulfil(response.statusCode); + }); + }); + expect(status).toBe(308); + await page.goto('/path-base/slash'); expect(page.url()).toBe(`${baseURL}/path-base/slash/`);