如何在PHP中设置cookie并进行重定向?

7fyelxc5  于 2022-10-30  发布在  PHP
关注(0)|答案(6)|浏览(255)

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

lf3rwulv

lf3rwulv1#

如果你有人类可读的url或子文件夹(如www.domain.com/path1/path2/),那么你必须将cookie path设置为/,以适用于所有路径,而不仅仅是当前路径。

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/)中可用。默认值是设置Cookie的当前目录。

djp7away

djp7away2#

您如何测试Cookie是否已设置?Cookie在设置后可在 next 页面上使用。
常见缺陷:
在下一次加载cookie应该可见的页面之前,cookie不会变为可见。要测试cookie是否设置成功,请在cookie过期之前检查下一个加载页面上的cookie。过期时间通过expire参数设置。调试cookie存在的一个好方法是简单地调用print_r($_COOKIE);。

holgip5t

holgip5t3#

我假设您运行的是IIS?当尝试在同一请求中同时设置cookie和位置标头时,IIS版本低于7时有一个已知的错误。
http://support.microsoft.com/kb/q176113/

qncylg1j

qncylg1j4#

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

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

hc2pp10m5#

在标头中使用相对URL:

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

guz6ccqo6#

我已经解决了这个问题

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>');

相关问题