6

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

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

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

4

2 回答 2

2

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 的服务器端访问浏览器的语言首选项,同时规避我的主机的超级农业缓存。

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

于 2013-04-05T18:34:40.653 回答
0

我对下面的代码没有这个问题。我能够example.com立即转到并被重定向到en.example.com并在$_COOKIES. 如果我使用过,我每次尝试en.example.com?set=fr都会被重定向到. 希望这就是你要找的!fr.example.comexample.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"];
?>
于 2013-03-10T07:45:00.940 回答