【问题标题】:Php cookie won't unset/delete - can't logoutPHP cookie 不会取消设置/删除 - 无法注销
【发布时间】:2015-01-01 18:36:34
【问题描述】:

所以我尝试了多种其他“解决方案”来解决我的问题(在本网站和其他网站上),但找不到适合我的解决方案。

我正在尝试设置一个 cookie 来登录我的用户,然后在注销时删除该 cookie。这是我的代码。

list ($check, $data) = check_login($dbc, $_POST['Username'], $_POST['Password']);
    if ($check) {
        setcookie('Username', $data['Username'], time() + 60*60*24*90);
        header('Location: RedirectPage.php');

其中,检查用户名和密码是否已在登录表单上输入(并被接受),如果是,则使用从数据库中提取的用户名设置 cookie“用户名”,时间等于 90 天,并且用户然后被重定向。

这部分工作正常,它让用户按预期登录。

但是在删除部分,

header('Refresh: 0;');

setcookie('Username', '', time() - 60*60*24*90);
unset($_COOKIE['Username']);
require ('RedirectPage.php');
redirect_user();

我按预期以与设置相同的方式删除 cookie,删除所有数据并将时间设置为负值,然后我运行未设置的 cookie 以确保它已经消失。

但是,这不起作用。 setcookie(删除)不做任何事情,并且未设置的 cookie 仅在页面运行后(在本例中为 index.php)以及当我单击另一个页面或刷新它“忘记”的页面时才在页面上起作用cookie 已被删除。

现在进入 Chrome 检查元素来检查我得到的 cookie

Username, "Value" (the withdrawn username), r3gamers.com (domain), / (path), 2015-02-03T13:45:00 (Expires/MaxAge), 19 (Size) and HTTP and Secure are both set as empty. 

点击退出按钮后观察过程,这个cookie永远不会被删除。唯一可以实际删除 cookie 的方法是用新的 cookie 覆盖它(再次登录)或通过检查元素删除它。

有什么想法吗?据我所知,我正在做应该做的一切。

编辑: 我还想提一下,在 localhost 上进行测试时,通过 netbeans 离线时,此功能确实有效。但是,当我为我的网站将页面上传到 godaddy 时,它们会停止正常工作。

【问题讨论】:

    标签: php cookies logout


    【解决方案1】:

    我找到了答案。这也是一个愚蠢的答案。这是我用于注销的完整代码文件。

    <?php
    
    require_once ('Connection.php');
    
    header('Refresh: 0;');
    
                if (!isset($_COOKIE['Username'])){
                    header('Location: LoginFunctions.php');
                } else {
                    setcookie('Username', '', time()-60*60*24*90, '/', '', 0, 0);
                    unset($_COOKIE['Username']);
                    header('Location: index.php');
                }
    
    
    ?>
    

    我无法在此处显示的问题是,开始的 php 标记上有一个换行符,这意味着它从第 2 行开始。最初我不知道为什么会这样,但那小错误意味着它可以在 localhost 上运行,而不能在 godaddy 上运行。多么令人沮丧。至少我现在已经解决了这个问题。

    为了将来的使用,对于那些遇到相同问题的人,显然godaddy(或大多数托管站点)要求从第 1 行开始添加、编辑或删除任何 cookie,因此包含 cookie 的 php 标签必须在线1、这个php标签之前不能有html代码,或者任何换行符,php标签必须从第1行开始。

    【讨论】:

    • 您的回答很有帮助 (y)。然而,这不仅仅是一件令人讨厌的事情。
    【解决方案2】:

    您没有设置 cookie 的路径,我假设您希望它是站点范围的,因此您应该将路径设置为 '/':

    setcookie('Username', $data['Username'], time() + 60*60*24*90, '/');

    然后,在取消设置时,尝试使用 1 代替 time() - 60*60*24*90(同样仍然指定路径),否则 cookie 的过期时间可能会根据用户的计算机时钟而有所不同:

    setcookie('Username', '', 1, '/');

    我认为您的问题确实是未设置路径:http://php.net/manual/en/function.setcookie.php

    如果设置为“/”,则 cookie 将在整个域中可用。如果设置为 '/foo/',则 cookie 将仅在 /foo/ 目录和域的 /foo/bar/ 等所有子目录中可用。默认值是设置 cookie 的当前目录。

    问题是,如果您在 /logout/doit.php 中,并且您尝试将 cookie 过期时间设置为负值,它将创建一个路径为 '/logout/' 的新 cookie 并设置其过期时间时间。 (而不是在您的站点范围的 cookie 上设置过期时间)

    【讨论】:

    • 这是我以前的,我将其删除以查看是否有帮助,但似乎没有任何区别。我现在已经完全按照您提到的方式添加了它,这对网站的行为没有任何影响。
    • 也许也将其设置为null 值...? setcookie('Username', null, 1, '/'); 从我在您的帖子中看到的,cookie 确实将自己设置为“/”路径......所以问题实际上在于它的未设置方式。
    • 再一次,这是我以前尝试过的。刚刚再次测试它,它仍然和我在第一篇文章中提到的完全一样。
    • 您是在 IIS 服务器上运行它吗?谷歌搜索,我读到 IIS(版本
    • 我刚刚编辑了第一篇文章,说明它在本地可以正常工作,但在 godaddy 上不行。现在我不确定 Godaddy 使用什么服务器,但假设它使用旧版本的 IIS,我如何在不实际重定向用户的情况下重定向用户?因为我必须以某种方式将用户重定向到主页,并且在页面被重定向之前不会删除 cookie。我不想要“您已注销”页面,但在这种情况下也许这是唯一的选择?
    猜你喜欢
    • 2012-01-21
    • 2016-11-13
    • 2019-01-18
    • 2015-03-12
    • 1970-01-01
    • 2011-09-05
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多