基本情况和基本相关信息:
我有一个在开始<doctype>
标记之前执行的PHP代码。希望是(如有必要)在加载任何其他内容之前根据用户的浏览器语言首选项发送重定向。
脚本会尝试根据支持的最高语言首选项执行两项操作:
setcookie()
创建一个包含两个字母的语言代码的cookie。
示例:
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没有。
那么如何让Chrome(和其他浏览器)识别自己的Cookie?!有谁知道为什么这会在Firefox上完美运行但在其他地方失败?
在云雀上我决定尝试这个。我创建了一个只包含以下内容的文件:
<?php
print_r($_COOKIE);
?>
再一次,我在Firefox中看到了cookie数组。同时,在Chrome,IE,Opera,Safari中,我得到一个空数组。这可能是服务器问题吗?
答案 0 :(得分:2)
OP返回并回答:
好吧,我把它添加为“答案”,万一其他人遇到这种(完全奇怪的)行为并落在这里:
事实证明我的托管服务提供商正在使用我不知道的WordPress网站进行一些严肃的攻击性缓存。
当我发布我的问题时,我不认为在WordPress上是相关的,但显然它是。
基本上是这样做的:
使用干净的缓存:
访问者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"];
?>