Repository navigation
fix: correctly serve ISR pages with trailing slash set to 'always' - #16903
Conversation
Adds a route with ISR enabled and trailingSlash set to "always" along with a platform test that navigates to it and verifies the URL pathname stays correct, the page renders, and no network or console errors occur. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Install the latest version of pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/8ab1c3eafee04b2d06867377a7805e828e4754e0Open in |
|
…vent redirect loops When ISR is enabled on a page with trailingSlash: 'always', the __pathname query param didn't include the trailing slash, causing SvelteKit to issue a redirect. Since ISR rewrites route back through the same handler, this created an infinite loop (visible as doubled path segments in the URL). Fix: detect when the Vercel route pattern has a trailing /? optional slash, convert it to a capture group (/)?, and use the corresponding backreference in __pathname so the slash is preserved when present. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…isr-trailing-slash-test
dc0723d to
85770ef
Compare
Co-authored-by: Nic Polumeyv <nicolas.polum@outlook.com>
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
|
@Nic-Polumeyv can you explain how the fix works? What happens to ISR routes with dynamic segments? Are they disallowed now or do they just still work? |
|
No problem, took me a couple hours to figure out! Vercel resolves a request in three steps (first match wins): adapter-vercel put every ISR src route in step 3. Only a src route attaches
The The fix puts ISR routes with no dynamic segments in step 1. Dynamic ones stay in step 3, since a Separately, Dynamic ISR routes still work, nothing about their placement changed. The one difference is |
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to version-3, this PR will be updated.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ `version-3` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run `changeset pre exit` on `version-3`.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ # Releases ## @sveltejs/adapter-cloudflare@8.0.0-next.7 ### Major Changes - breaking: populate env vars before `instrumentation.server.js` is evaluated and update the adapter instrumentation API ([#16303](#16303)) - breaking: remove cloudflare `platform`, emulate the `cloudflare:workers` module instead ([#16754](#16754)) - breaking: replace the `builder.generateManifest` with `builder.generateServerInstance` and `builder.manifest` ([#16875](#16875)) ### Patch Changes - Updated dependencies [[`9a4b343`](9a4b343), [`ee2f55b`](ee2f55b), [`65673a4`](65673a4), [`1b79845`](1b79845), [`b12bb78`](b12bb78), [`03f1687`](03f1687), [`49f0808`](49f0808), [`e7c74bf`](e7c74bf), [`0876d63`](0876d63), [`9a2b9ba`](9a2b9ba), [`c9f54b5`](c9f54b5), [`22b8152`](22b8152), [`f6d44cf`](f6d44cf), [`3c3a27b`](3c3a27b), [`7f376b1`](7f376b1), [`8a587c7`](8a587c7), [`aa4f960`](aa4f960)]: - @sveltejs/kit@3.0.0-next.27 ## @sveltejs/adapter-netlify@7.0.0-next.11 ### Major Changes - breaking: populate env vars before `instrumentation.server.js` is evaluated and update the adapter instrumentation API ([#16303](#16303)) - breaking: replace the `builder.generateManifest` with `builder.generateServerInstance` and `builder.manifest` ([#16875](#16875)) ### Patch Changes - fix: route requests with omitted optional parameters to split serverless functions ([#17020](#17020)) - fix: copy `_redirects` when deploying edge function ([#17047](#17047)) - chore: replace `@iarna/toml` with `smol-toml` ([#16948](#16948)) - chore: identify serverless functions with a UUID instead of Netlify's function token ([#17044](#17044)) - fix: ensure serverless function files have unique names ([#17049](#17049)) - Updated dependencies [[`9a4b343`](9a4b343), [`ee2f55b`](ee2f55b), [`65673a4`](65673a4), [`1b79845`](1b79845), [`b12bb78`](b12bb78), [`03f1687`](03f1687), [`49f0808`](49f0808), [`e7c74bf`](e7c74bf), [`0876d63`](0876d63), [`9a2b9ba`](9a2b9ba), [`c9f54b5`](c9f54b5), [`22b8152`](22b8152), [`f6d44cf`](f6d44cf), [`3c3a27b`](3c3a27b), [`7f376b1`](7f376b1), [`8a587c7`](8a587c7), [`aa4f960`](aa4f960)]: - @sveltejs/kit@3.0.0-next.27 ## @sveltejs/adapter-node@6.0.0-next.12 ### Major Changes - breaking: populate env vars before `instrumentation.server.js` is evaluated and update the adapter instrumentation API ([#16303](#16303)) - breaking: replace the `builder.generateManifest` with `builder.generateServerInstance` and `builder.manifest` ([#16875](#16875)) ### Patch Changes - Updated dependencies [[`9a4b343`](9a4b343), [`ee2f55b`](ee2f55b), [`65673a4`](65673a4), [`1b79845`](1b79845), [`b12bb78`](b12bb78), [`03f1687`](03f1687), [`49f0808`](49f0808), [`e7c74bf`](e7c74bf), [`0876d63`](0876d63), [`9a2b9ba`](9a2b9ba), [`c9f54b5`](c9f54b5), [`22b8152`](22b8152), [`f6d44cf`](f6d44cf), [`3c3a27b`](3c3a27b), [`7f376b1`](7f376b1), [`8a587c7`](8a587c7), [`aa4f960`](aa4f960)]: - @sveltejs/kit@3.0.0-next.27 ## @sveltejs/adapter-vercel@7.0.0-next.9 ### Major Changes - breaking: populate env vars before `instrumentation.server.js` is evaluated and update the adapter instrumentation API ([#16303](#16303)) - breaking: replace the `builder.generateManifest` with `builder.generateServerInstance` and `builder.manifest` ([#16875](#16875)) ### Patch Changes - fix: pass the requested pathname, including any trailing slash, to ISR functions ([#16903](#16903)) - fix: trace `process.cwd()`-relative files from the project directory and never glob from the filesystem root ([#16972](#16972)) - Updated dependencies [[`9a4b343`](9a4b343), [`ee2f55b`](ee2f55b), [`65673a4`](65673a4), [`1b79845`](1b79845), [`b12bb78`](b12bb78), [`03f1687`](03f1687), [`49f0808`](49f0808), [`e7c74bf`](e7c74bf), [`0876d63`](0876d63), [`9a2b9ba`](9a2b9ba), [`c9f54b5`](c9f54b5), [`22b8152`](22b8152), [`f6d44cf`](f6d44cf), [`3c3a27b`](3c3a27b), [`7f376b1`](7f376b1), [`8a587c7`](8a587c7), [`aa4f960`](aa4f960)]: - @sveltejs/kit@3.0.0-next.27 ## @sveltejs/kit@3.0.0-next.27 ### Major Changes - major: error when a client-requested single-flight mutation isn't respected by the server, allow the server to explicitly ignore refreshes ([#16892](#16892)) - breaking: remove `Server` constructor and `SSRManifest` from public types ([#16876](#16876)) - breaking: replace the `builder.generateManifest` with `builder.generateServerInstance` and `builder.manifest` ([#16875](#16875)) ### Minor Changes - feat: allow adapters to receive the Svelte config as a function argument when adding Vite plugins ([#16986](#16986)) - feat: allow adapters to override `getRequest` and `setResponse` during `vite dev` and `vite preview` ([#16753](#16753)) ### Patch Changes - fix: respect `paths.relative` during development for client files ([#17053](#17053)) - fix: clarify circular imports from `src/env` ([#17014](#17014)) - breaking: populate env vars before `instrumentation.server.js` is evaluated and update the adapter instrumentation API ([#16303](#16303)) - fix: record a history traversal before resolving its route ([#16959](#16959)) - fix: support coordinate objects from image inputs in remote forms ([#16944](#16944)) - fix: walk and copy directories without a stat per file ([#16995](#16995)) - fix: widen remote form fields for union schemas and string enums ([#16937](#16937)) - fix: respond to `HEAD` requests without a body ([#17036](#17036)) - chore: replace deprecated Vite dev server APIs ([#16961](#16961)) - fix: settle a query's pending request in place when its value arrives through `set()` ([#16958](#16958)) - fix: prevent `await_reactivity_loss` warning and `state_unsafe_mutation` error when the new version detector runs after an `await` ([#16915](#16915)) - chore: parse page options and remote modules with Vite's `parseSync` instead of `acorn` ([#16947](#16947)) ## @sveltejs/adapter-auto@8.0.0-next.4 ### Minor Changes - feat: add zero-config deployment support for Render ([#16850](#16850)) ### Patch Changes - Updated dependencies [[`9a4b343`](9a4b343), [`ee2f55b`](ee2f55b), [`65673a4`](65673a4), [`1b79845`](1b79845), [`b12bb78`](b12bb78), [`03f1687`](03f1687), [`49f0808`](49f0808), [`e7c74bf`](e7c74bf), [`0876d63`](0876d63), [`9a2b9ba`](9a2b9ba), [`c9f54b5`](c9f54b5), [`22b8152`](22b8152), [`f6d44cf`](f6d44cf), [`3c3a27b`](3c3a27b), [`7f376b1`](7f376b1), [`8a587c7`](8a587c7), [`aa4f960`](aa4f960)]: - @sveltejs/kit@3.0.0-next.27 ## @sveltejs/package@3.0.0-next.8 ### Patch Changes - chore: read the Svelte config via `@sveltejs/load-config` ([#17039](#17039)) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Fixed #12556
Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
Tests
pnpm testand lint the project withpnpm lintandpnpm checkChangesets
pnpm changesetand following the prompts. Changesets that add features should beminorand those that fix bugs should bepatch. Please prefix changeset messages withfeat:,fix:, orchore:.Edits