禁用cookie的php setcookie行为

时间:2016-08-25 14:46:00

标签: php cookies setcookie

当客户端禁用cookie时,任何人都可以确认PHP的setcookie()函数的行为吗?根据文件:

“如果在调用此函数之前存在输出,则setcookie()将失败并返回FALSE。如果setcookie()成功运行,它将返回TRUE。这并不表示用户是否接受了cookie。”

我不确定'成功运行'究竟意味着什么,但这让我相信实现并不关心客户端是否接受cookie,而且我们不必担心PHP错误/与cookie实际设置有关的警告。是吗?

提前致谢

3 个答案:

答案 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。