php 在禁用 cookie 的情况下设置 cookie 行为

php setcookie behavior with cookies disabled

当客户端禁用 cookie 时,谁能确认 PHP 的 setcookie() 函数的行为?根据文档:

"If output exists prior to calling this function, setcookie() will fail and return FALSE. If setcookie() successfully runs, it will return TRUE. This does not indicate whether the user accepted the cookie."

我不确定 'successfully runs' 的确切含义,但这让我相信实现不关心客户端是否接受 cookie,我们不必担心PHP 与实际设置或未设置 cookie 相关的错误/警告。是吗?

提前致谢

非常正确,服务器无法检测客户端设置,您应该通过自己的实现来验证这一点。

如果您在第一次请求时发送 cookie,则在下一次请求时检查它是否存在。然后你就会知道客户端是否排除 cookie。如果不是这种情况,您只有 IP 和浏览器 headers 可以告诉您 可能 是同一用户。

下一个请求可以是新页面请求,也可以是 Ajax 请求,它也发送 headers 并因此包含 cookie(如果浏览器除外)。

如果您将唯一标识符附加到新的请求 uri 并从他或她那里得到一个空的 cookie 响应,您就知道浏览器不会排除 cookie。

没有。 setcookie()Set-Cookie HTTP header 传递给网络服务器,后者又将其传输给客户端。

  • 任何与 header 有关的警告都是您的代码结构问题。另见:How to fix "Headers already sent" error in PHP

  • setcookie() 的结果代码并不表示客户端是否支持 Set-Cookie HTTP header。因为 PHP 和网络服务器都不知道。

Cookie 通过 http header 发送。 Headers 可以 总是 发送。他们是否 accepted/ignored 无关紧要 - 你可以发送任何你想要的 header。

判断客户端是否已接受 cookie 的唯一方法是客户端在其 NEXT 请求时是否将 cookie 发送回服务器。

setcookie() 失败的唯一方法是输出已经开始。这会导致 PHP "headers already sent" 警告。

例如正常的 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 ...

这是行不通的。当 Headers 在响应的 header 块中时,它们只是 header。如果它们出现在 body 中,则它们不是 header - 它们是内容的一部分。这就是 PHP 发出 "headers already sent" 并且不发送 cookie 的原因。不行-火车已经出站了