diff --git a/packages/docusaurus/src/commands/serve/__tests__/requestHandler.test.ts b/packages/docusaurus/src/commands/serve/__tests__/requestHandler.test.ts index 895a4a46f608..9ce6a645e3b6 100644 --- a/packages/docusaurus/src/commands/serve/__tests__/requestHandler.test.ts +++ b/packages/docusaurus/src/commands/serve/__tests__/requestHandler.test.ts @@ -637,14 +637,24 @@ describe('createServeRequestHandler', () => { ).resolves.toBe('301 /base/file → 200 file.html'); }); - // TODO fix: keep the baseUrl, "301 /base/file → 200 file.html" - // cspell:ignore Ffile - it('drops the baseUrl when serve-handler merges encoded slashes', async () => { + // cspell:ignore Ffile Ehtml + it('keeps the baseUrl with encoded slashes', async () => { await expect( serveRequest( {baseUrl: '/base/', trailingSlash: false}, '/base/%2F%2Ffile', ), + ).resolves.toBe('200 file.html'); + }); + + // TODO fix: keep the baseUrl, "301 /base/file → 200 file.html" + // serve-handler decodes the path before its clean URL redirect + it('drops the baseUrl in clean URL redirects of encoded paths', async () => { + await expect( + serveRequest( + {baseUrl: '/base/', trailingSlash: undefined}, + '/base/file%2Ehtml', + ), ).resolves.toBe('301 /file → 302 /base/ → 200 index.html'); }); diff --git a/packages/docusaurus/src/commands/serve/requestHandler.ts b/packages/docusaurus/src/commands/serve/requestHandler.ts index f755f08bad6c..ecca322cffb7 100644 --- a/packages/docusaurus/src/commands/serve/requestHandler.ts +++ b/packages/docusaurus/src/commands/serve/requestHandler.ts @@ -65,7 +65,9 @@ export function createServeRequestHandler({ await serveHandler(req, res, { cleanUrls: true, public: outDir, - trailingSlash, + // We do the trailing slash redirects: serve-handler would decode + // encoded slashes, merge them and drop the baseUrl + trailingSlash: undefined, directoryListing: false, // serve-handler only answers 304 to an ETag revalidation, and the ETag // stays the same when a rebuild doesn't change the file content