PHP脚本在Safari(macOS及iOS端)无法读取已设置的Cookie
我之前也踩过Safari Cookie的坑,它在Cookie规则的执行上确实比Chrome、Firefox要苛刻得多。先帮你理清楚问题场景:
问题场景:通过PHP的
setcookie('cookiename', '1', time()+1200, '/');设置Cookie后,Safari开发者工具能看到Cookie已正确存储,但任何页面的PHP代码读取$_COOKIE时都返回空数组,Chrome和Firefox则完全正常。
下面是几个实测有效的解决方向,你可以逐个尝试:
显式设置SameSite属性
Safari对Cookie的SameSite属性有严格的默认校验,早期PHP版本的setcookie默认不会设置这个属性,很容易被Safari拦截。你可以显式指定SameSite=Lax(大部分场景下足够),如果是跨域场景需要用SameSite=None,但必须配合secure属性(仅HTTPS环境可用):// 普通同域场景 setcookie('cookiename', '1', [ 'expires' => time() + 1200, 'path' => '/', 'samesite' => 'Lax', ]); // HTTPS环境下跨域场景 setcookie('cookiename', '1', [ 'expires' => time() + 1200, 'path' => '/', 'samesite' => 'None', 'secure' => true, ]);确认Cookie的域名匹配
域名不匹配是另一个常见原因,比如本地开发用localhost却没指定域名参数,或者线上环境带www和不带www的域名混淆。你可以显式指定Cookie的域名:// 本地localhost场景 setcookie('cookiename', '1', time()+1200, '/', 'localhost'); // 线上主域名及子域名场景 setcookie('cookiename', '1', time()+1200, '/', '.yourdomain.com');检查Safari隐私设置
打开Safari的「设置-隐私与安全性」,确认是否开启了「阻止所有Cookie」,或者「跟踪预防」设置为最严格模式。如果开启了阻止,即使开发者工具能看到Cookie,浏览器也不会在请求时把它发送给服务器,PHP自然就读不到$_COOKIE了。本地开发的HTTPS适配
如果你是在本地用HTTP环境开发,Safari的部分版本会限制非HTTPS环境下的Cookie存储(尤其是SameSite=None的情况)。可以尝试搭建本地HTTPS环境(比如用mkcert生成信任证书)后再测试。排查Cookie名称/值的合规性
虽然你的示例里Cookie名称没问题,但如果实际场景中用了特殊字符(比如空格、中文、非法符号),Safari可能会异常处理。确保Cookie名称符合RFC规范,只用字母、数字和!#$%&'*+-.^_|~`这类合法字符。
一般来说,SameSite属性或域名设置的问题最容易导致这个情况,你可以优先尝试前两个方案。
内容来源于stack exchange

