在Chrome浏览器中无法访问cookie,在Firefox浏览器中可以正常工作


Cannot access cookies in Chrome, works properly in Firefox

基本情况和基本相关信息:我有一个php代码,在打开<doctype>标记之前执行。希望(如果有必要的话)在加载其他内容之前根据用户浏览器的语言偏好发送重定向。

脚本尝试基于最高支持的语言首选项做两件事:

  1. 使用php: setcookie()创建一个包含两个字母语言代码的cookie。
    • 示例cookie name = value: x_language = es
  2. 使用php: header("Location: ")美元requestedSite);要重定向到子域,
    • 示例域:es.domain.com

的例子:

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

问题:火狐运行得很好。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,我得到一个空数组。这可能是服务器问题吗?

OP返回答案:

好吧,我把这个作为一个"答案",以防其他人遇到这种(完全奇怪的)行为并落在这里:

原来我的主机提供商在我不知情的情况下对我的WordPress网站做了一些严重的侵略性缓存。

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

基本上它是这样做的:


与干净的缓存:

  • 访问者1访问站点。
  • php按照预期处理和输出。
  • 为访问者1提供php输出(基于其浏览器的参数等)。

  • 访问者2访问站点。访问者2看到*访问者1的站点版本

每次缓存清理只处理一次。

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

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


我的解决方案:

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

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

我希望这能帮助到别人!感谢所有帮助我解决这个问题的人

我下面的代码没有这个问题。我能够去example.com,并立即被重定向到en.example.com,并在$_COOKIES中看到cookie。如果我使用en.example.com?set=fr,每次我尝试example.com时都会被重定向到fr.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"];
?>