PHP cookie和重定向

巴黎法老王

我有一个使用两种语言的网站:英语和法语。我想根据他们的浏览器语言来重定向人:如果浏览器语言是法语,我将在上重定向人/fr,否则他们将转到常规站点(即,不重定向)。

为了做到这一点,我首先使用了一个PHP会话(带有PHP函数session_start),并且运行良好。但是会话的问题在于您无法控制将cookie绑定到会话的时间(我读到会话直到关闭浏览器才结束,但是在我的情况下它不起作用:会话的cookie是当我关闭并再次打开浏览器时,它仍然存在)。因此,我决定使用cookie(setcookie代替PHP函数)来控制其持续时间。因此,我修改了先前为该会话制作的代码(正在运行)以使用该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错误消息:

页面未正确重定向。Firefox已检测到服务器正在以永远无法完成的方式重定向对该地址的请求。有时可能是由于禁用或拒绝接受Cookie引起的。

问题是当我使用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);
    }
}

我有两个问题:

  1. 为什么重定向不使用我的第一段代码,而是使用第二段代码?
  2. 另一个与此无关的问题:为什么当我使用cookie设置cookie时,setcookie必须等待页面重新加载,这样我才能使用$_COOKIE(来自PHP手册:“一旦设置cookie,就可以在下一次访问cookie时访问cookie值。使用$ _COOKIE数组加载页面”),但是使用会话Cookie,我可以立即使用$_SESSION访问其变量

任何帮助将不胜感激。

奇·拉杰瓦·洛查纳

尝试:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章