如何设置cookie然后在PHP中重定向?

时间:2009-03-04 19:20:17

标签: php cookies http-headers

在进行一些处理之后,我想为用户输入设置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

5 个答案:

答案 0 :(得分:71)

如果您有人工网址或子文件夹(例如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。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

  

常见陷阱:

     

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

答案 3 :(得分:0)

在标题中使用相对网址:

@Header("Location: orders_9090_1.php");

答案 4 :(得分:0)

我已经为此制定了解决方案

    setcookie(self::SESSION_NAME, $session_id, $expires, '/', null, null, true);
    header("Set-cookie: ".self::SESSION_NAME."=".$session_id."; expires=".date('D, Y-M-d H:i:s', $expires)." GMT; path=/; HttpOnly; secure=true; SameSite=Strict");
    
//check is something printed
    if (!headers_sent()) {
    
//is there any header set
                if( !array_map(function($header){ return preg_match('/Set-cookie/i', $header) ? true : null; }, headers_list()) ){
    
                    die(header('Location: ' . $url));
                }
            }
            die('<script type="text/javascript">window.location.href = ' . ($append ? 'window.location.href' : '') . ($append && $url ? '+' : '') . ($url ? '"' . $url . '"' : '') . ';</script>');