If you have a Sveltekit client-only application that uses the static adapter, there are few caveats when setting up redirects. The most problematic being the lack of a server to serve a Location
header. Here’s a simple setup to handle this without having to move to a non-static adapter.
Redirects.js
First, create a redirects.js
file in the src
folder. This is the file where you will be declaring all your redirects.
1export const APP_REDIRECTS = {2 '/from': '/to'3}
.ts
won’t work as we will need to import this insvelte.config.js
you can’t have this file in the project root. It must be located in the
src
folder or another folder insidesrc
.
Layout.ts
Create a layout.ts
file in src/routes
folder to handle the redirects.
1import { redirect } from "@sveltejs/kit"; 2import { APP_REDIRECTS } from "../redirects"; 3 4 5export async function load({ url }) { 6 const pathname = url.pathname; 7 8 if (APP_REDIRECTS.hasOwnProperty(pathname)) { 9 return redirect(301, (APP_REDIRECTS as any)[pathname]);10 }11}
This file checks if the current path is in the APP_REDIRECTS
object, and if yes, returns a redirect
response.
That is all you need to make it work on the dev server. But, wait, there’s no dynamic server when you build the app using the static adapter. So, how do redirects work?
Svelte.config.js
By default, the static adapter crawls through the links in your app and finds pages to build. This even works for dynamic routes like /docs/{page}
as long as they are linked to from within the app.
However, it is very likely that you won’t be linking to the redirected old pages. In that case, the easiest option is to set those pages in the prerender.entries
option in svelte.config.js
.
1import { APP_REDIRECTS } from './src/redirects.js'; 2 3const config = { 4 // other options... 5 6 kit: { 7 // other options... 8 prerender: { 9 entries: [10 '*',11 ...Object.keys(APP_REDIRECTS)12 ]13 }14 },15};
We already have the paths in the APP_REDIRECTS
object. We’ll simply get the keys and add it to entries
. Sveltekit will then nicely generate static HTML files for the redirects.
To test, run npm run build
and then npm run preview
. Visit the old page to make sure the redirect is working.
If you look inside the build
folder, you will see a code that looks like this. That’s how Sveltekit handles a redirect in the front-end without having to use the Location
header.
1<script>location.href="/to";</script><meta http-equiv="refresh" content="0;url=/to">
I hope someday, there will be a much easier way to do this inside the configuration of the static adapter. But, this will work for now! :)
Comments