te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>svelte - Is it possible to know the redirect origin when server-side redirecting to another SvelteKit route? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin4浏览0评论

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?

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?

Share Improve this question asked Feb 17 at 16:09 goose_lakegoose_lake 1,4808 silver badges24 bronze badges 2
  • AFAIK If the redirect happens within the application (does not trigger reload), you can save the origin to a state variable and read it on the second page after redirect. – Mikko Ohtamaa Commented Feb 17 at 18:36
  • @MikkoOhtamaa: Redirects are responses to the client and the client decides what to do with that. Also, setting state variables on the server is generally a very bad idea. it easily leads to data leaking between different users. (If you store session state in some kind of dictionary indexed via a user session cookie that would be fine.) – brunnerh Commented Feb 17 at 19:28
Add a comment  | 

1 Answer 1

Reset to default 1

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.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论