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