PHP cookie 和重定向
PHP cookies and redirection
我的网站有两种语言:英语和法语。我想根据他们的浏览器语言重定向人们:如果浏览器语言是法语,我会在 /fr
上重定向人们,否则他们会转到常用站点(即不重定向)。
为了做到这一点,我首先使用了一个 PHP 会话(使用 PHP 函数 session_start
)并且它运行良好。但是会话的问题是您无法控制绑定到会话的 cookie 的时间(我读到会话持续到您关闭浏览器,但在我的情况下它不起作用:会话的 cookie 是当我关闭并再次打开我的浏览器时仍然存在)。因此,我决定使用 cookie(使用 PHP 函数 setcookie
代替)来控制其持续时间。因此,我修改了之前为会话(正在运行)编写的代码,改为使用 setcookie
函数:
// If the cookie "first_time" is not defined, we define it
// and do the redirection if the browser language is French,
// else we do nothing.
// In this case, we only redirect (or not) the first time we go on the website,
// which is exactly what we want.
if( !isset($_COOKIE["first_time"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("first_time", "", time()+3600, "/", "", 0);
if ($browser_lang == "fr") {
header("Location: /fr");
}
}
但是,我收到一个 Firefox 错误消息:
The page isn’t redirecting properly. Firefox has detected that the
server is redirecting the request for this address in a way that will
never complete. This problem can sometimes be caused by disabling or
refusing to accept cookies.
问题是当我使用 PHP 会话进行重定向时,我没有出现此错误。此外,当我执行以下代码时(这不是我想要的),我也没有问题(发生重定向):
if( !isset($_COOKIE["flag"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("flag", "0", time()+30, "/", "", 0);
}
else {
if ($_COOKIE["flag"] == "0") {
header("Location: /fr");
setcookie("flag", "1", time()+30, "/", "", 0);
}
}
我有两个问题:
- 为什么重定向对我的第一段代码不起作用,但对第二段代码起作用?
- 另一个与此无关的问题:为什么当我使用
setcookie
设置 cookie 时,我必须等待页面重新加载,以便我可以使用 $_COOKIE
访问 cookie 值(来自 PHP 手册:“设置 cookie 后,可以在下一页加载时使用 $_COOKIE 数组访问它们”),但是使用会话 cookie 我可以立即使用 $_SESSION
?[=36 访问其变量=]
任何帮助将不胜感激。
尝试:
if( !isset($_COOKIE["first_time"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("first_time", "1", time()+3600, "/", "", 0);
if( !isset($_COOKIE["first_time"]) ){
header("Reload:0");
}
if ($browser_lang == "fr") {
header("Location: /fr");
}
}
我的网站有两种语言:英语和法语。我想根据他们的浏览器语言重定向人们:如果浏览器语言是法语,我会在 /fr
上重定向人们,否则他们会转到常用站点(即不重定向)。
为了做到这一点,我首先使用了一个 PHP 会话(使用 PHP 函数 session_start
)并且它运行良好。但是会话的问题是您无法控制绑定到会话的 cookie 的时间(我读到会话持续到您关闭浏览器,但在我的情况下它不起作用:会话的 cookie 是当我关闭并再次打开我的浏览器时仍然存在)。因此,我决定使用 cookie(使用 PHP 函数 setcookie
代替)来控制其持续时间。因此,我修改了之前为会话(正在运行)编写的代码,改为使用 setcookie
函数:
// If the cookie "first_time" is not defined, we define it
// and do the redirection if the browser language is French,
// else we do nothing.
// In this case, we only redirect (or not) the first time we go on the website,
// which is exactly what we want.
if( !isset($_COOKIE["first_time"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("first_time", "", time()+3600, "/", "", 0);
if ($browser_lang == "fr") {
header("Location: /fr");
}
}
但是,我收到一个 Firefox 错误消息:
The page isn’t redirecting properly. Firefox has detected that the server is redirecting the request for this address in a way that will never complete. This problem can sometimes be caused by disabling or refusing to accept cookies.
问题是当我使用 PHP 会话进行重定向时,我没有出现此错误。此外,当我执行以下代码时(这不是我想要的),我也没有问题(发生重定向):
if( !isset($_COOKIE["flag"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("flag", "0", time()+30, "/", "", 0);
}
else {
if ($_COOKIE["flag"] == "0") {
header("Location: /fr");
setcookie("flag", "1", time()+30, "/", "", 0);
}
}
我有两个问题:
- 为什么重定向对我的第一段代码不起作用,但对第二段代码起作用?
- 另一个与此无关的问题:为什么当我使用
setcookie
设置 cookie 时,我必须等待页面重新加载,以便我可以使用$_COOKIE
访问 cookie 值(来自 PHP 手册:“设置 cookie 后,可以在下一页加载时使用 $_COOKIE 数组访问它们”),但是使用会话 cookie 我可以立即使用$_SESSION
?[=36 访问其变量=]
任何帮助将不胜感激。
尝试:
if( !isset($_COOKIE["first_time"]) ){
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
setcookie("first_time", "1", time()+3600, "/", "", 0);
if( !isset($_COOKIE["first_time"]) ){
header("Reload:0");
}
if ($browser_lang == "fr") {
header("Location: /fr");
}
}