php删除cookie反倒被赋值为deleted 解决办法
原因是:
如果遇到用户客户端的电脑本地时间 比当前服务器时间少1年以上,IE浏览器就会出现这种情况。这种情况会致使用户永远点击退出退出不了。因为username被赋值为deleted。
以下PHP删除Cookie代码可以在PHP5.20的linux源码包中ext/standard/head.c第99行附近找到。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
if
(value && value_len == 0){
/*
* MSIE doesn't delete a cookie when you set it to a null value so in order to force cookies to be deleted, even on MSIE, we pick an expiry date 1 year and 1 second in the past
*/
time_t t = time(NULL) - 31536001;
dt = PHP_format_date(
"D, d-M-Y H:i:s T"
, sizeof(
"D, d-M-Y H:i:s T"
)-1, t, 0 TSRMLS_CC);
sprintf(cookie,
"Set-Cookie: %s=deleted; expires=%s"
, name, dt);
efree(dt);
}
else
{
sprintf(cookie,
"Set-Cookie: %s=%s"
, name, value ? encoded_value :
""
);
if
(expires > 0){
strcat(cookie,
"; expires="
);
dt = PHP_format_date(
"D, d-M-Y H:i:s T"
, sizeof(
"D, d-M-Y H:i:s T"
)-1, expires, 0 TSRMLS_CC);
strcat(cookie, dt);
efree(dt);
}
}
|
源码中清清楚楚的显示,if (value && value_len == 0) ,当value_len为0时sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);会发送PHP删除Cookie的http头给浏览器.最后我们可以得出结论,在PHP中使用setcookie($cookiename, '');或者 setcookie($cookiename, NULL);都会实现PHP删除Cookie,当然这些手册中并没有。
解决办法:
方法一:修改用户客户端时间跟服务器时间一样。(即同步到标准的北京时间即可)。
方法二:页面给个“请修改本地时间”的提示。(用js获取本地时间和php获取服务器时间对比下,如果间隔一年以上就提示)
本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1211270,如需转载请自行联系原作者