【问题标题】:Cannot access cookies in Chrome, works properly in Firefox无法在 Chrome 中访问 c​​ookie,在 Firefox 中正常工作
【发布时间】:2013-03-08 19:45:58
【问题描述】:

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

脚本尝试根据支持的最高语言偏好做两件事:

  1. 使用 php:setcookie() 创建带有两个字母语言代码的 cookie。
    • 示例 cookie 名称 = 值:x_language = es
  2. 使用 php: header("位置:" . $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);
}

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

【问题讨论】:

  • 我以前遇到过这个问题。您发送 Location 标头和 Set-Cookie 标头的顺序在这里很重要。不过我不记得哪个先了。碰到其他聪明的大师......
  • 谢谢,兰登斯。但似乎两者都不是。问题在于读取 cookie,而不是写入。 cookie 正按应有的方式编写(我可以在 Dev Tools 控制台中看到它),但由于某种原因它对我的 php 脚本不可用。
  • Chrome 对子域 cookie 共享可能更挑剔,当您打印 $_COOKIE 时,您是在 domain.com 还是 subdomain.domain.com 上? stackoverflow.com/questions/7880305/…
  • 这种行为是否可以在网上某处观察到?

标签: php google-chrome firefox cookies


【解决方案1】:

OP 返回答案:

好的,我将其添加为“答案”,以防其他人遇到这种(完全奇怪的)行为并落在此处:

事实证明,我的托管服务提供商正在对我的 WordPress 网站进行一些我不知道的非常激进的缓存。

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

基本上是这样做的:


使用干净的缓存:

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

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

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

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

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


我的解决方案:

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

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

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

【讨论】:

    【解决方案2】:

    下面的代码没有这个问题。我能够转到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"];
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2022-08-05
      相关资源
      最近更新 更多