http-redirectsveltesveltekit

Is it possible to know the redirect origin when server-side redirecting to another SvelteKit route?


I hate two routes in my SvelteKit app, /a and /b. The first route can conditionally redirect to the second when loading:

// src/routes/a/+page.server.ts
export async function load({ url }) {
    // some check, irrelevant to question
    if (Math.random() < 0.5) {
        redirect(301, `/b`);
    } else {
        return;
    }
}

On the second route, I would like to know if the page was requested as a result of that redirect, or navigated to directly (i.e. by user pasting the URL into the address bar) -- if it's a redirect, I'd like to show something slightly different on the page itself.

// src/routes/b/+page.server.ts
export async function load({ url }) {
    // Here, I'd like to know if this is a direct navigation or a redirect
    const isRedirectFromRouteA: boolean = /* ??? */;
    return {
        // Depending on this, +page.svelte shows something different
        showExtraInfo: isRedirectFromRouteA
    };
}

Is there a way to achieve this?


Solution

  • One way would be to set a cookie temporarily.

    // in /a
    export async function load({ cookies }) {
      cookies.set('redirect-from-route', '/a', { path: '/' });
      redirect(302, `/b`);
    }
    
    // in /b
    export async function load({ cookies }) {
      const fromRoute = cookies.get('redirect-from-route');
      if (fromRoute != null)
        cookies.delete('redirect-from-route', { path: '/' });
    
      if (fromRoute == '/a')
        // ...
    }
    

    Another would be to set a query parameter in the redirect URL, though that will be visible and removing it would involve another redirect or a history state replacement.

    301 (Moved Permanently) is possibly not the best status code here. It will lead to caching of the redirect in the browser which prevents attaching additional information upon subsequent requests, so the cookie will not exist.