为什么浏览器在第二个请求时不将 PHPSESSID cookie 从前一个请求标头发送回服务器?

Why doesn't the browser send the PHPSESSID cookie from the previous request header back to the server on a second request?

提问人:LeoRado 提问时间:10/19/2023 更新时间:10/19/2023 访问量:50

问:

似乎我不太了解 PHP 和浏览器中 cookie 的处理。我不明白浏览器何时存储 cookie 并将其发送回去,以及浏览器何时不存储并且不将其发送回去。我尝试了PHP的本地服务器的以下代码:PHPSESSIDphp -S localhost:8900 ./test.php

在第一个示例中,我在第二个请求中正确获取了 cookie。因此,在第一个请求中打印一个空数组,在后续请求中,它打印带有会话 cookie 的数组:print_r

<?php
print_r($_COOKIE);
if (!isset($_COOKIE['PHPSESSID'])) {
    session_start();
    echo "Starting a session<br/><hr/>";
}

在第一次请求之后:Array ( ) Starting a session

在第二个请求之后:Array ( [PHPSESSID] => 4f5eh40sjlul4ggs86evee0s73 )


但是使用以下代码,我永远不会在服务器端代码中获得 cookie。我可以看到服务器在响应标头中发送回 cookie,如第一个示例所示,但浏览器似乎没有存储它,因此浏览器不会在第二个后续请求中将 cookie 发送到服务器:PHPSESSID

<?php
print_r($_COOKIE);
if (!isset($_COOKIE['PHPSESSID'])) {
    session_start();
    echo "Starting a session<br/><hr/>";
}
else {
    echo "Destroying a session<br/>";
    setcookie('PHPSESSID', '', time() - 3600);
}

问题是我正在一个大的PHP BE上处理会话,我试图弄清楚PHP中的会话是如何工作的,尤其是使用cookie。PHPSESSID

所以,我真的很想了解会话处理的这一部分。

会话 cookie php-8

评论

0赞 CBroe 10/19/2023
根据cookie是否已经存在进行调用,一开始就没有意义。即使已经设置了该 cookie - 您仍然需要调用 PHP 来再次获取由该 cookie 值标识的会话,否则您将没有会话。session_startPHPSESSIDsession_start

答:

2赞 Quentin 10/19/2023 #1

对于每个请求,您的代码在设置和销毁会话之间交替进行

既然你说:

php -S localhost:8900 ./test.php

...每个请求都会通过您的脚本。

因此,当您在浏览器的地址栏中输入内容时,它会请求并创建会话,然后请求并删除 cookie。当您重新加载时,它会重复。http://localhost:8900///favicon.ico/

评论

0赞 LeoRado 10/19/2023
啊,我对会话处理感到非常困惑,以至于我忽略了它。我的错! 请求刚刚奏效。谢谢你@Quentin!php -S localhost:8900localhost:8900/test.php