setcookie()在Google Chrome中未设置cookie

35

我正在学习如何设置PHP cookies的教程。我发现cookies已经成功地在FF4和IE9上设置了,但是在Chrome(11.0.696.60)中却没有被设置。该PHP文件是从XAMPP(localhost)提供的。

我尝试了w3schools上的示例:

<?php
setcookie("user", "Alex Porter", time()+3600);
?>

以下内容来源于此网站(适用于本地环境):

<?php
setcookie("username", "George", false, "/", false);
?>

提前感谢。


7
第一个问题是“我尝试了w3schools上的例子”。你最好查看PHP文档,这样会更有帮助。 - alex
你在Chrome浏览器中启用了cookie吗? - Explosion Pills
你尝试过缓存刷新(Shift+F5)来确保它不仅仅是引用了缓存版本吗?或者尝试在“隐私浏览”模式下打开页面(Ctrl+Shift+P)。看看你是否得到了相同的结果。 - Jim
@alex 我刚刚尝试了 PHP 文档中的示例 1(尝试了第一和第二个 setcookie 行),结果是相同的。@tandu Cookie 绝对是启用的,在 Chrome 中没有任何异常,并且存储 cookie 的站点也可以正常工作。@Brad F Jacobs 尝试了强制刷新和清除缓存以确保。注意:这在 Linux 上的 Chrome 上也会发生。 - Elyas
6个回答

41

禁用IP地址和localhost的cookie是一项设计决策。另请参见:https://code.google.com/p/chromium/issues/detail?id=56211

解决此问题的方法包括:

  • 设置本地域名(例如,编辑/etc/hosts以使用127.0.0.1 localhost.com)。
  • 使用http://myproject.localhacks.com/(指向127.0.0.1)。
  • 在设置cookie时使用空域值。

例如,在PHP中:

setcookie(
  $AUTH_COOKIE_NAME,
  $cookie_value,
  time() + cookie_expiration(),
  $BASE_DIRECTORY,
  null,
  false,
  true
);

如果设置值为 null,则表示不应设置域。

注意:如果不设置域,则 cookie 不可见于子域。


太棒了!非常感谢。我在IE和Chrome上遇到了问题,但在FF、Opera或Safari(在WAMP系统上)上没有问题。我已经尝试了几乎所有的方法。顺便问一下 - 这是故意的设计决定吗? - Diogenes
1
嗯,这很奇怪。我一直在使用Chrome在本地设置cookie而没有任何问题。你确定这个“bug”只适用于使用JavaScript设置cookie吗? - Dolda2000

16

域名应该等于NULL。

& 应该给予一个到期日。例如,

setcookie("username", "George", time() + (20 * 365 * 24 * 60 * 60), "/", NULL);

1
这对我也解决了问题,但我不明白为什么?我以为为cookie设置域名是标准做法。而且对我来说,是否在Chrome中设置cookie域名有效似乎取决于服务器。 - Abhi Beckert

5
似乎这可能是Chrome“开发者工具”功能的一个错误。我一直在尝试设置Cookie(但不是检索Cookie),并且在其他浏览器中可以工作。假设您信任FF的Cookie查看部分或IE的Cookie文件定位,则它可以工作。在Chrome中,我依赖于“开发人员工具”的“Cookie”部分(开发人员工具>资源>Cookie)。
我决定更进一步,使用WHT中找到的此脚本实际输出Cookie的值(posted by Natcoweb)。
<?php
setcookie('test', 'This is a test', time() + 3600);
if(isset($_COOKIE['test'])){
$cookieSet = 'The cookie is ' . $_COOKIE['test'];
} else {
$cookieSet = 'No cookie has been set';
}
?>

<html>
<head><title>cookie</title></head>
<body>

<?php
echo $cookieSet;
?>

</body>
</html>

我尝试在所有浏览器上使用,包括Chrome(我得到的是:“The cookie is This is a test”)!然而,Chrome的cookie检查器仍然显示“此站点没有cookie”。我还成功找到了存储在Chrome设置中的cookie列表(选项>在底部>内容设置>所有cookie和站点数据),最终找到了cookie(需要更多步骤来检查,但至少比开发者工具更准确)!

结论:cookie已被设置,但Chrome的开发工具由于某种原因无法看到它。


这是不可能的情况。您无法从分配它的同一脚本访问 $_COOKIE['test'],除非页面已将其数据发送到浏览器。$_COOKIE['test']仅在每个来自浏览器的请求中分配。 - Mohammed Joraid

2

您是否检查了系统日期? $ date 如果是旧的时间,那么您应该更改时间 $ date -s 2007.04.08-22:46+0000

希望这可以帮助您。我曾经遇到过同样的问题,而这个方法解决了它。


2

当我尝试如下操作时,我遇到了相同的问题:

setcookie("gb_role",base64_encode($_SESSION["role"]),time()+60*60*24*30);

当我将其更改为以下内容时

setcookie("gb_role",base64_encode($_SESSION["role"]),time()+2592000);

我之前使用time()+60*60*24*30正常运行,但我现在改为了time()+某个数字值。虽然这样做没有任何意义,但它却奏效了。


1

这段代码在IE、Chrome和FF中都能正常工作

if($_COOKIE['language']==NULL || empty($_COOKIE['language']))
{


    $dirname = rtrim(dirname($_SERVER['PHP_SELF']), '/').'/';

    $expire=time()+31536000;


    setcookie("language", "English",$expire,"$dirname","mydomain.com",false,false);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接