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

我有两个问题:

  1. 为什么重定向对我的第一段代码不起作用,但对第二段代码起作用?
  2. 另一个与此无关的问题:为什么当我使用 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");
    }
}