[英]How do I delete PHPSESSID on client computers
更新问题:
setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/', 'www.mywebsite.com');
但这失败了。 setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/');
导致我设置的PHPSESSID被删除。 session_name
重命名我设置的SESSION。 这可以工作,但几分钟后几次崩溃了我的服务器。 我正在我的网站上使用PHP会话。
会话路径是/文件夹,稍后我改为/以适应新目的。
现在,老用户无法登录。
看起来他们现在有两个PHPSESSID存储在他们的浏览器上 - 一个带有路径/文件夹,另一个带有/。
我该怎么做才能确保旧用户可以登录,同时确保会话在整个网站范围内使用“/”。
更多信息
当我说两个phpsessionid时,请参考图像
A. session_set_cookie_params(864000, '/cv', '.website.com', 0, 1);
但如果我使用,则无法工作:
B. session_set_cookie_params(864000, '/', '.website.com', 0, 1);
使用JAVASCRIPT删除PHPSESSID的更新
使用PHP删除PHPSESSID的更新
var_dump($_COOKIE['PHPSESSID']);
返回的是具有path / cv的PHPSESSID的值 setcookie ("PHPSESSID", "", time() - 3600);
删除setcookie ("PHPSESSID", "", time() - 3600);
失败。 我认为你正在混淆事情,或者你应该详细了解你的设置/问题。
PHP的会话路径是会话数据存储在服务器上的位置,而不是客户端。 请参阅文档: https : //secure.php.net/manual/en/session.configuration.php#ini.session.save-path
您可以移动这些文件并在发生碰撞时替换/保留您认为合适的方式。 这几乎只受访问/移动内容时的读/写权限以及您的web服务器用户(例如apache或nginx)或php-user用于从/向新位置读取/写入它们所限制。
如果通过“浏览器中的PHPSESSID”表示会话ID是您的网址的一部分,这是一个不同的PHP设置,无论如何应该禁用,请参阅文档中的注意事项: https : //secure.php.net/manual /en/session.configuration.php#ini.session.use-trans-sid
根据您更新的问题进行修改:
已经有一个很好的基于JS的解决方案,用于使旧cookie过期。 我会那样做的。 如果你不能这样做,你可以重定向到/cv
有一个php脚本在那里读取cookie并将数据存储在某个地方(例如基于user_id的数据库)并使cookie过期。 然后,您可以重定向到旧页面,查找“/” - cookie并恢复数据。 这是一个非常丑陋的黑客,但我不认为你可以在PHP中获取每个路径的cookie,因为它是服务器端并且基于客户端提供的会话ID(但我可能是错的)。
我只是从/folder
过期cookie。 这应该只留下一个会话cookie /
setcookie('PHPSESSID', '', time() - 86400, '/folder/');
您可以在session_start()之前使用session_name()更改新会话的cookie名称,并让问题在几天后自行解决。
session_name("SESSION_ID");
session_start();
您必须在客户端删除cookie。 使用javascript可以实现这一点。
在您的网站上试试这个javascript:
<script type="text/javascript">
document.cookie = "PHPSESSID=;Path=/cv;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
</script>
一个例子:
对于此示例,请使用站点https://developer.mozilla.org/en-US/ 。
如果我在cookie上加载此站点,则有以下条目 现在我想删除名为
dwf_section_edit
的cookie。 要删除此cookie,我将过期日期设置为过去。 我执行后
document.cookie = "dwf_section_edit=;Path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
在控制台上,cookie就像你在下面的图像上看到的那样(我使用了表左下方的小刷新按钮,因为它只是在这个例子中是临时的)
在下一次重新加载时,我在这个例子中再次获取cookie,因为Mozilla会将它还给我。 在您的网站上,您不必再次创建旧cookie,一切都很好。
我想你的脚本不知道,在session_start()时应该访问哪个会话;
尝试为会话指定正确的路径
ini_set('session.cookie_path', '/');
要么
session_start(['cookie_path' => '/']);
取决于您的设置
如果这没有帮助,我建议使用session_regenerate_id() ,它将用新的会话ID替换当前的会话ID,并保留当前的会话信息。
解决方案是让用户在会话到期时间内转到/文件夹路径。 在这条路径上创建php脚本,使用setcookie函数将所有COOKIES从/文件夹复制到/ path( http://php.net/manual/ro/function.setcookie.php )
foreach ($_COOKIE as $key => $value) {
setcookie($key, $value, $expire, "/")
}
// redirect to "/" now. User will be able to login.
补充说明:cookie与路径和域绑定,其重要性(默认为/ ,但似乎不适用于您的情况)。 所以来自子路径(如/ folder或/ me)的PHPSESSID无法从父级访问。 他们从父母传播到孩子。 所以来自/我的 cookie与没有明确分配的/相同。
如果手动发送包含所需路径的新过期日期的标题,则客户端应将其删除。
session_start();
header("Set-Cookie:PHPSESSID=".session_id()."; expires=Sat, 07-Nov-1999 14:58:07 GMT; path=/cv/");
第一次,你有旧的cookie路径,但从第二页调用只有路径/
的cookie将被存储和传输。
当您知道客户端是否受此问题影响或者持续一个月时,您可以发送此标头。
是的,你需要将cookie时间设置为负值,以便浏览器可以删除它,在adition中我们将存储的值设置为空字符串,这也有助于删除相同的cookie ...
这个(页面的顶部)可以做,只需确保session_start()
首先:
setcookie('PHPSESSID', '', -3600, '/cv');
这在我的所有域名上完美运行,我曾经遇到过这个问题。
您可以通过将其设置为之前的过期来将其删除:
setcookie('phpsessid','value',time()-1);
调用setcookie
函数时只需提供第4个参数:
setcookie ("PHPSESSID", "", time() - 3600, '/');
说明
setcookie()
函数的第四个参数是要设置的会话的$path
。 为此,“默认值是设置cookie的当前目录。”。 (参见: http : //php.net/manual/en/function.setcookie.php 。)因此,如果您从位于文件夹“/ folder”的文件中调用此函数,它将尝试从该文件夹中删除cookie只要。 通过将$path
设置为“/”,我们告诉函数从根目录中删除session_id。
我测试了它,它成功地从cookie中删除了PHPSESSID
。
这里提到了 ,虽然不推荐使用session_register()并且首选使用$ _SESSION: -
如果在调用此函数之前未调用session_start(),则将对没有参数的session_start()进行隐式调用。 $ _SESSION不会模仿此行为,并且在使用前需要session_start()。
然后,使用$ _SESSION,使用Auth = True附加一个JSON文件,TimeOut = 20分钟。
每当用户注销或超时后,设置Auth = False。 然后,使用PHP和。读取该JSON文件
然后,如果Auth = False,则使用PHP创建JS,即OnLoad事件, document.cookie = 'PHPSESSID' + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
让我们回到基础 - 这是我认为你应该尝试的东西:运行你的网站。 记下PHPSESSID。 然后完全关闭浏览器,再次打开浏览器,然后运行您的站点。 检查PHPSESSID并查看它是否相同。
如果它不相同则不是cookie而是特定于浏览器会话的会话ID。 其次,如果PHPSESSID与第一次设置相同,那么它就是一个cookie,您将能够删除任何设置为cookie资源的key => value对。 可能是你在JS或PHP代码中引用了一些错误的东西。
请尝试这个并恢复结果。 它将提供更多的清晰度。 Sessions,LocalStorage,IndexDB,Cookies都是不同的东西,并以不同的方式引用。
首先要了解的是,您无法以任何方式删除客户端系统上的COOKIES
。 当您无效时,浏览器不会删除它,但会使cookie无效。 cookie仍然存在于客户端系统上。 但浏览器只是忽略它。 为了删除它,客户端必须自己完成。
要使您可以使用的所有会话无效
session_start(); // initialize session
session_destroy(); // destroy session
setcookie("PHPSESSID","",time()-3600,"/"); // delete session cookie
或javascript代码:
document.cookie = "PHPSESSID=; expires=Thu, 01 Jan 1970 00:00:00
UTC;path=/;host=localhost";
在每种情况下,您都无法删除浏览器设置的cookie。 因为PHP和javascript只能发出命令,只会使已经设置的cookie无效。
由客户自己。
刷新cookie和缓存的方向
卸载浏览器,然后重新安装。
创建一个新的PHP脚本并将其插入login.php的顶部,并在此脚本中检查是否有两个PHPSessionId,如果有两个,则销毁所有这些并重新加载页面。 直到您重新加载在任何事件将在会话之前使用的最后一个cookie。 您必须重新加载页面或重定向使用:
删除两个PHPSESSID
count=0;
foreach($_COOKIE as $key => $value){
if ( $key == "PHPSESSID" ){
count++;
}
}
if (count>1){
//Destory all cookies here
foreach($_COOKIE as $key => $value){
setcookie($key,"",time()-3600,"/");
}
//Reload/redirect the current page to dispose of all things
header("Locations:" . $your_url);
exit(0);
}
现在每种情况下只会有一次PHPSESSID会话
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.