基本情况和基本相关信息:我有一个php代码,在打开<doctype>
标记之前执行。希望(如果有必要的话)在加载其他内容之前根据用户浏览器的语言偏好发送重定向。
脚本尝试基于最高支持的语言首选项做两件事:
- 使用php:
setcookie()
创建一个包含两个字母语言代码的cookie。- 示例cookie name = value: x_language = es
- 使用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"];
?>