这在所有浏览器的本地开发版本上运行完全正常…
foreach ($_COOKIE as $key=>$val) {
echo $val . '<br />';
}
…并将返回页面上的所有当前cookie值,如下所示:
10000
20000
30000
问题是它在Firefox或Edge产品中没有返回任何东西。它确实可以在Chrome上运行。
这是Chrome开发工具在我的本地版本上看到的cookie:
Name Value Domain Path Expires / Max-Age Size Priority
------------------------------------------------------------------------------------------------
wish_product_10425 10000 testing.local / 2021-08-08T04:48:37.000Z 23 Medium
wish_product_10499 20000 testing.local / 2021-08-09T01:54:38.000Z 23 Medium
wish_product_10644 30000 testing.local / 2021-08-09T01:54:39.000Z 23 Medium
…以下是Firefox开发工具在我的本地版本上看到的cookie:
Name Value Domain Path Expires / Max-Age Size HttpOnly Secure Priority SameSite
--------------------------------------------------------------------------------------------------------------------------------
wish_product_10425 10000 testing.local / 2021-08-08T04:48:37.000Z 23 false false Medium None
wish_product_10499 20000 testing.local / 2021-08-09T01:54:38.000Z 23 false false Medium None
wish_product_10644 30000 testing.local / 2021-08-09T01:54:39.000Z 23 false false Medium None
总而言之,它可以在所有浏览器的本地开发版本中工作,但在生产环境中,它只能在Chrome中工作。
仅供参考,在生产中cookie域是正确的生产域。没有PHP错误。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite:
具有
SameSite=None
的cookie现在也必须指定Secure
属性(它们需要安全上下文/HTTPS)。
你的cookie设置为SameSite=None
,但也设置为Secure=false
,这意味着Firefox将阻止它们,即不将它们发送回后续请求。
您需要设置Secure=true
,然后通过HTTPS访问您的系统-或者而不是设置SameSite=None
。(所以Lax
或Strict
代替)
根据@CBroe的建议修复了cookie后,这个循环仍然不起作用:
foreach ($_COOKIE as $key=>$val) {
echo $val . '<br />';
}
…直到我在一个完全不同的web主机上尝试它,它工作得很好(我的其他cookie相关脚本也是如此)。
问题原来是我们的主机WPEngine,根据我的支持对话,他说解决这个问题的唯一方法是他们从缓存中排除所需的cookie名称(或部分cookie名称)。
一旦完成,一切都工作了。
更多信息:https://wpengine.com/support/cookies-and-php-sessions/