2

我正在使用 RewriteRule 在 htaccess 中创建烹饪。在我的测试中,我根本无法让这个 cookie 消失。这是我创建 cookie 的方式,我在这个线程中得到了帮助:

[L,CO=redirect_indicator:yes:.www.example.com,R=301]

所以 cookie 有默认的过期时间,应该只是浏览会话的持续时间。我试图在我的脚本结束时销毁它,我只是得到令人困惑的结果。

因此,我将在脚本顶部执行此操作以查看 cookie 以进行测试:

var_dump($_COOKIE['redirect_indicator']);

然后在我的脚本结束时,我运行以下命令(在这里的另一个堆栈线程的帮助下)我也尝试了比这更简单的销毁脚本,但似乎没有一个可以解决问题:

if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

现在在该代码部分之后,我也再次运行它:

var_dump($_COOKIE['redirect_indicator']);

事实上,cookie 不存在!这很好,但是当我在不应生成 cookie 的页面上再次运行脚本时,cookie 仍然会在我的第一个 var_dump 期间出现。

有没有办法摆脱这个 cookie,或者我会永远受制于浏览器存储的内容。当我重新启动浏览器时它确实消失了,但是在脚本执行后我需要这个东西消失。

4

2 回答 2

1

一些想法:

(1) 在您的脚本中,您读出 $_COOKIE,然后覆盖一个 cookie,然后再次查看 $_COOKIE。$_COOKIE 同时更新了吗?正如用户在http://www.php.net/manual/en/reserved.variables.cookies.php上提供的注释所说:

" $_COOKIE 的值由用户代理请求中收到的 cookie 的内容决定。

如果你设置了一个cookie(即发送到浏览器),它不会在下一个请求之前被发回,因此数据不会出现在$_COOKIE 中。"

您对 $_COOKIE 的第二次调用只是保留了此变量在脚本开头保存的值。查看您的浏览器以查看您的 cookie 是否已更改或删除,而不是 $_COOKIE。

(2) 在您链接到的线程中,它说您的 .htaccess 应该说:

RewriteRule ^example/directory/go\.php$ example.com/go.php [L,CO=tracker:yes:.example.com,R=301]

不是:

[L,CO=redirect_indicator:yes:.www.example.com,R=301]

当你写。会不会是您忘记了该行的第一部分,因此您的 [flags] 会应用于任何 RewriteRule 位于其之上的内容,甚至应用于被调用的每个页面?

(3) 为什么不在重定向中传递旧 URL 而不是将其保存在 cookie 中:

    RewriteRule ^(example/directory/go\.php)$ example.com/go.php?old=$1 [R=301]

然后您可以在 go.php 中解析 $_GET['old']。

于 2012-04-15T14:35:14.047 回答
1
setcookie($name, '', time()-1000);

以上确实是设置了过去的过期时间,这是删除 cookie 的唯一方法 - 但是,在用户关闭所有浏览器窗口之前,cookie 不会从用户计算机中删除。

如果您需要 cookie 不再影响脚本,请将值重置为稍后可以定义为异常的值,例如“删除”

if(isset($_COOKIE['redirect_indicator']) && $_COOKIE['redirect_indicator'] !== 'delete')
于 2012-04-12T17:06:26.627 回答