在Brave浏览器中,PHP Cookie未执行删除却已不存在的问题
我尝试通过PHP先设置一个新Cookie,检查它是否存在,再将过期时间设为过去来删除Cookie,最后验证删除是否成功。但奇怪的是,第一次检查Cookie是否存在时,它就显示不存在,尽管删除操作是在这次检查之后才执行的。
问题代码
<?php setcookie("Test", "test", time() + 3600, "/", "", true, true); if (isset($_COOKIE["Test"])) { echo "<p>Cookie 'Test' exists.</p>"; } else { echo "<p>Cookie 'Test' doesn't exist.</p>"; } setcookie("Test", "", time() - 3600); if (isset($_COOKIE["Test"])) { echo "<p>Cookie 'Test' exists.</p>"; } else { echo "<p>Cookie 'Test' doesn't exist.</p>"; } ?>
预期输出
我预期浏览器输出为:
Cookie 'Test' exists. Cookie 'Test' doesn't exist.
问题原因
$_COOKIE 数组存储的是当前请求中浏览器发送过来的Cookie,而非你刚通过setcookie()设置的Cookie。setcookie()的作用是向浏览器发送一个设置Cookie的响应头,浏览器只有接收到这个响应后才会保存Cookie,并且要等到下一次请求时才会把这个Cookie发送回服务器。所以第一次调用setcookie()后,$_COOKIE["Test"]仍然是空的——这次请求里浏览器根本没把这个Cookie发过来。
解决方法
- 同请求内验证Cookie:如果要在同一个请求里确认刚设置的Cookie,可手动把值同步到
$_COOKIE数组:
setcookie("Test", "test", time() + 3600, "/", "", true, true); $_COOKIE["Test"] = "test"; // 手动同步值到$_COOKIE if (isset($_COOKIE["Test"])) { echo "<p>Cookie 'Test' exists.</p>"; } else { echo "<p>Cookie 'Test' doesn't exist.</p>"; }
- 正确删除Cookie:删除Cookie的
setcookie()调用需要和设置时的参数保持一致(除过期时间和值),否则可能无法正确清除:
setcookie("Test", "", time() - 3600, "/", "", true, true);
注意:即使调整后,同一个请求里的第二次检查仍会显示Cookie存在(因为$_COOKIE值未更新),要验证删除是否成功,需刷新页面或发起新请求,此时浏览器就不会再发送该Cookie了。
内容的提问来源于stack exchange,提问作者Alexander Hunger
相关产品推荐
相关产品推荐

