在进行一些处理之后,我想为用户输入设置cookie值,然后将它们重定向到新页面。但是,cookie没有设置。如果我注释掉重定向,则cookie已成功设置。我认为这是某种类型的标题问题。这种情况的最佳解决方法是什么?

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30);
    header("Location: $url");
    exit;
}

请注意,在任何一种情况下,setcookie都会返回 true ,并且我没有收到任何错误/警告/通知。

编辑:我使用的是Unix / Apache / MySQL / PHP

有帮助吗?

解决方案

如果您有人工网址或子文件夹(例如www.domain.com/path1/path2/),则必须将Cookie路径设置为/以适用于所有路径,而不仅仅是当前路径。

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    header("Location: $url");
    exit;
}

从PHP手册:

  

服务器上的路径   cookie将可用。如果设置为   '/',cookie将可用   在整个域内。如果设置为   '/ foo /',cookie只会是   在/ foo /目录中可用   和所有子目录,如   / foo / bar /域名。默认   value是当前目录   正在设置cookie。

其他提示

我假设您正在运行IIS?尝试在同一请求中设置cookie和位置标头时,IIS版本小于7时存在已知错误。

http://support.microsoft.com/kb/q176113/

如果设置了cookie,您如何测试?设置完成后,下一页页面上会显示Cookie。

  

常见陷阱:

     

在下次加载可以看到Cookie的网页之前,Cookie才会显示。要测试cookie是否已成功设置,请在cookie过期前检查下一个加载页面上的cookie。过期时间通过expire参数设置。调试cookie存在的一种好方法是简单地调用print_r($ _ COOKIE);。

我能够通过在刷新标头中稍微延迟来解决这个问题。我们设置标题(必须在可能输出的任何方法之前完成,比如setcookie),然后设置cookie。我添加了一条消息,以便用户在几秒钟内看不到空白屏幕。

    header("refresh: 2; url=$url");
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    echo "Processing, please wait...";

在标题中使用相对网址:

@Header("Location: orders_9090_1.php");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top