PHP 重定向到基于用户位置的页面版本 (IPAPI) 并在会话中记住

PHP redirect to page version based user’s location (IPAPI) and remember in a session

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

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

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

我正在使用 ipapi.com 检查用户的位置。我也在使用 ProcessWire 的“$session”,它实际上与 PHP session.

相同
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");
    }

}

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

查看$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' 时可能无法正常工作。我需要更多关于这将如何工作的细节,如果 NAnaINTdefault 确实存在不同的状态,以及什么时候应该发生什么当设置 lucentLightingRegion 时,none 个指定值是 viewable() 页。目前如果设置了lucentLightingRegion而不是viewable()或者lucentLightingSessionRedirected"true",就会满足none的条件。