1

我正在尝试在 head.inc 文件中包含一些代码,以检查该页面是否以用户的位置语言可用,如果是,它将重定向到该页面。显然,这对 UX 来说不是很好,但可惜我的客户很热衷。

我需要克服的唯一问题是,如果用户已经被重定向,那么不要为每个页面都这样做......存储用户被重定向的事实并且在会话结束之前不要再次这样做。类似的东西。

我已经编写了下面的代码,但是 a) 我不确定这是最好的方法,并且 b) 它似乎卡在了重定向循环中(我认为我已经通过第二次会话检查避免了这种情况)。

我正在使用 ipapi.com 来检查用户的位置。我还在使用 ProcessWire 的“$session”,它实际上与 PHP 会话相同。

if (!$session->get("lucentLightingRegion")) {

    $session->set("lucentLightingSessionRedirected", "false");
    if ($page->ipapiGetUserLocation()['continent_code'] === 'NA') {
        $session->set("lucentLightingRegion", "NA");
        if ($page->viewable('na')) {
            $url = $page->localUrl('na');
            $session->redirect($url);
        }
    } else {
        $session->set("lucentLightingRegion", "INT");
        if ($page->viewable('default')) {
            $url = $page->localUrl('default');
            $session->redirect($url);
        }
    }

} else {

    $sessionRegion = $session->get("lucentLightingRegion");

    bd($sessionRegion);

    if ($page->viewable($sessionRegion) && $session->get("lucentLightingSessionRedirected") == "false") {
        $url = $page->localUrl($sessionRegion);
        $session->redirect($url);
        $session->set("lucentLightingSessionRedirected", "true");
    }

}
4

1 回答 1

5

$session->redirect($url);之前打电话$session->set("lucentLightingSessionRedirected", "true");似乎是你的问题。

查看$session->redirect()它的源代码执行:

header("Location: $url");
exit(0);

这是防止$session->set("lucentLightingSessionRedirected", "true");被调用,导致重定向循环,因为lucentLightingSessionRedirected从未设置为"true".

要解决此问题,您应该能够更改操作顺序。

    if ($page->viewable($sessionRegion) && $session->get("lucentLightingSessionRedirected") == "false") {
        $session->set("lucentLightingSessionRedirected", "true");
        $url = $page->localUrl($sessionRegion);
        $session->redirect($url);
    }

请记住,Wire::__call()用于发布Session::__redirect()


但是,您的会话和区域重定向似乎也存在逻辑缺陷,这可能会导致不希望的状态。由于$page->localUrl()使用小写值但lucentLightingRegion为大写,我不知道您的应用程序是如何设计来处理它们的。INT此外,加载页面的默认区域,default在重定向到$sessionRegion = 'INT'. 我需要更多关于预期如何工作的详细信息,以及 , 和 是否确实存在不同的状态,NA以及当设置的指定值都不是页面时应该发生什么。目前 if is set and is not或is ,将不满足任何条件。naINTdefaultviewable()lucentLightingRegionlucentLightingRegionviewable()lucentLightingSessionRedirected"true"

于 2020-01-04T23:32:41.667 回答