无法访问Chrome中的Cookie,无法在Firefox中正常使用

时间:2013-03-08 19:45:58

标签: php google-chrome firefox cookies

基本情况和基本相关信息: 我有一个在开始<doctype>标记之前执行的PHP代码。希望是(如有必要)在加载任何其他内容之前根据用户的浏览器语言首选项发送重定向。

脚本会尝试根据支持的最高语言首选项执行两项操作:

  1. 使用php:setcookie()创建一个包含两个字母的语言代码的cookie。
    • 示例Cookie名称=值:x_language = es
  2. 使用php:header(“Location:”。$ requestedSite);重定向到子域,
    • 示例域名:es.domain.com
  3. 示例:

    if (isset($_COOKIE['x_language'])) {
        -Determine correct subdomain based on cookie value-
        -If not currently on that subdomain, redirect to it-
    } else {
        setcookie('x_language','es',time() + 31536000 ,'/','.domain.com' );
        header("Location: " . $requestedSite);
    }
    

    问题: Firefox完美运行。 Chrome(和其他浏览器)根本无法识别Cookie。

    我已将其归结为:

    • print_r($_COOKIE)在Firefox中正常运行,并返回一个可爱的,已填充的数组。
    • print_r($_COOKIE)在Chrome中失败,并返回一个空数组。

    这是问题的核心,我的功能无法识别Cookie的存在,因为Chrome没有。

    • 我确保每个浏览器都接受Cookie。
    • 我已经检查了开发工具,以确保所有浏览器都存在Cookie,(确实如此)。
    • 我意识到在下一页加载之前cookie不可用,但这不是问题。即使设置完毕,也无法读取。
    • 初始setcookie();
    • 之上没有输出

    那么如何让Chrome(和其他浏览器)识别自己的Cookie?!有谁知道为什么这会在Firefox上完美运行但在其他地方失败?


    在云雀上我决定尝试这个。我创建了一个只包含以下内容的文件:

    <?php
    print_r($_COOKIE);
    ?>
    

    再一次,我在Firefox中看到了cookie数组。同时,在Chrome,IE,Opera,Safari中,我得到一个空数组。这可能是服务器问题吗?

2 个答案:

答案 0 :(得分:2)

OP返回并回答:

好吧,我把它添加为“答案”,万一其他人遇到这种(完全奇怪的)行为并落在这里:

事实证明我的托管服务提供商正在使用我不知道的WordPress网站进行一些严肃的攻击性缓存。

当我发布我的问题时,我不认为在WordPress上是相关的,但显然它是。

基本上是这样做的:


使用干净的缓存:

  • 访客1访问该网站。
  • php处理并按预期生成输出。
  • 访问者1提供php输出(基于他的浏览器参数等)。

  • 访问者2访问该网站。访问者2看到 *访客1的网站版本。

每个缓存清除一次,只处理一次。

这种缓存行为意味着通过php访问cookie根本无法正常工作,但使用Javascript访问它们可以正常工作。

重要说明:事实证明,对于在登录wordpress时查看网站的任何用户,已禁用上述缓存行为,这很常见WordPress缓存插件的行为。这就是为什么我在Firefox中看到的行为与我在其他浏览器中看到的不同,因为我是在积极登录Firefox。这对于那里的人来说可能是一个有用的信息。)


我的解决方案:

使用Javascript对.php文件运行AJAX查询,该文件将处理访问者的语言首选项并将输出作为双字符代码返回(即'en''es''pt'' de'等)

使用AJAX调用php允许我使用php的服务器端访问浏览器的语言首选项,同时绕过我的主机的超级农业缓存。

我希望这有助于某人!感谢所有试图帮助我解决这个问题的人。

答案 1 :(得分:0)

我在下面的代码中没有遇到此问题。我可以转到example.com并立即重定向到en.example.com并在$_COOKIES中查看Cookie。如果我使用en.example.com?set=fr,每次尝试fr.example.com时,我都会被重定向到example.com。希望这是你想要的!

<?php
print_r($_COOKIE);

if(isset($_GET['nuke'])) {
    setcookie('x_language','',time()-1000,'/','.example.com');
    echo 'It has been nuked!';
    exit;
} else if(isset($_GET['set'])) {
    setcookie('x_language',$_GET['set'],time() + 31536000, '/','.example.com');
    $_COOKIE['x_language'] = $_GET['set'];
}

if (isset($_COOKIE['x_language'])) {
    $redirect = $_COOKIE['x_language'].'.example.com';
    if($_SERVER['HTTP_HOST'] != $redirect)
        header('Location: http://'.$redirect);
} else {
    setcookie('x_language','en',time() + 31536000,'/','.example.com');
    $redirect = 'http://en.example.com';
    header('Location: '.$redirect);
}

echo '<br />Cookie: '.$_COOKIE['x_language'].' Domain: '.$_SERVER["HTTP_HOST"];
?>