php删除cookie反倒被赋值为deleted 解决办法
原因是:
如果遇到用户客户端的电脑本地时间 比当前服务器时间少1年以上,IE浏览器就会出现这种情况。这种情况会致使用户永远点击退出退出不了。因为username被赋值为deleted。
<a target="_blank" href="http://blog.51cto.com/attachment/201305/152559627.jpg"></a>
以下PHP删除Cookie代码可以在PHP5.20的linux源码包中ext/standard/head.c第99行附近找到。
<code>if</code><code>(value && value_len == 0){</code>
<code> </code><code>/*</code>
<code> </code><code>* 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</code>
<code> </code><code>*/</code>
<code> </code><code>time_t t = time(NULL) - 31536001;</code>
<code> </code><code>dt = PHP_format_date(</code><code>"D, d-M-Y H:i:s T"</code><code>, sizeof(</code><code>"D, d-M-Y H:i:s T"</code><code>)-1, t, 0 TSRMLS_CC);</code>
<code> </code><code>sprintf(cookie, </code><code>"Set-Cookie: %s=deleted; expires=%s"</code><code>, name, dt);</code>
<code> </code><code>efree(dt);</code>
<code> </code><code>}</code>
<code>else</code><code>{</code>
<code> </code><code>sprintf(cookie, </code><code>"Set-Cookie: %s=%s"</code><code>, name, value ? encoded_value : </code><code>""</code><code>);</code>
<code> </code><code>if</code> <code>(expires > 0){</code>
<code> </code><code>strcat(cookie, </code><code>"; expires="</code><code>);</code>
<code> </code><code>dt = PHP_format_date(</code><code>"D, d-M-Y H:i:s T"</code><code>, sizeof(</code><code>"D, d-M-Y H:i:s T"</code><code>)-1, expires, 0 TSRMLS_CC);</code>
<code> </code><code>strcat(cookie, dt);</code>
<code> </code><code>}</code>
<code>}</code>
源码中清清楚楚的显示,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,如需转载请自行联系原作者