当客户端禁用cookie时,任何人都可以确认PHP的setcookie()函数的行为吗?根据文件:
“如果在调用此函数之前存在输出,则setcookie()将失败并返回FALSE。如果setcookie()成功运行,它将返回TRUE。这并不表示用户是否接受了cookie。”
我不确定'成功运行'究竟意味着什么,但这让我相信实现并不关心客户端是否接受cookie,而且我们不必担心PHP错误/与cookie实际设置有关的警告。是吗?
提前致谢
答案 0 :(得分:5)
Cookie通过http标头发送。标题可以始终发送。无论他们被接受/忽略都无关紧要 - 您可以发送任何你想要的标题。
判断客户端是否已接受cookie的唯一方法是客户端在其NEXT请求中将cookie发送回服务器。
setcookie()
失败的唯一方法是输出已经开始。这导致PHP“标头已发送”警告。
e.g。正常的HTTP服务器 - >客户端响应如下所示:
HTTP/1.1 200 OK
Content-type: text/html
Cookie: ...cookie data here ...
<html><body>Hi mom!</body></html>
但是如果你先输出,那么在调用setcookie之前,你最终会得到这样的结果:
HTTP/1.1 200 OK
Content-type: text/html
<html><body>Hi mom!</body></html>
Cookie: ... cookie data here ...
哪个不起作用。当标题位于响应的标题块中时,标题只是标题。如果它们出现在体内,它们就不是标题 - 它们是内容的一部分。这就是为什么PHP发出“已经发送的标题”,并且不发送cookie。它不能 - 火车已离开车站。
答案 1 :(得分:3)
没有。 setcookie()
将Set-Cookie
HTTP标头传递给网络服务器,网络服务器又将其传输到客户端。
与标题有关的任何警告都是您的代码结构问题。另见:How to fix "Headers already sent" error in PHP
setcookie()
的结果代码并不表示客户端是否尊重Set-Cookie
HTTP标头。因为PHP和网络服务器都不知道。
答案 2 :(得分:2)
非常正确,服务器无法检测客户端设置,您应该使用自己的实现进行验证。
如果您在第一次请求时发送cookie,请检查下一个请求是否存在。然后你会知道客户是否排除了cookie。如果情况并非如此,您只有IP和浏览器标题可以告诉您可能是同一个用户。
下一个请求可以是新的页面请求,也可以是一个Ajax请求,它也会发送标题,从而包含cookie(如果浏览器除外)。
如果您为新请求uri附加了唯一标识符并获得了他或她的空cookie响应,则您知道浏览器不会包含Cookie。