最近写东西的时候突然发现 cookies 无法保存的问题,一直以来都是使用 setcookie() 来定义设置没啥问题的。查阅了手册后才发现是 PHP>=7.3.0 setcookie 开始支持设置 SameSite 后语法有了修改造成的。OK!直接改成下面新的写法,不仅能够正确定义 cookies 了,浏览器也不会再报 SameSite 黄字错误了。
SameSite值及释义
- Strict:完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。
- Lax:大多数情况不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
- None:对于正确支持 None 的浏览器,可以正确发送相关 cookie。
PHP VERSION >= 7.3.0 正确的写法
setcookie($name, $value, [
'expires' => $expire,
'path' => $path,
'domain' => $domain,
'secure' => $secure,
'httponly' => $httponly,
'samesite' => $samesite
]);
我们为了让它能够适应多版本PHP,可以做一个函数封装起来。
PHP 全版本适用写法
/*
* Support samesite cookie in both php 7.2 and php >= 7.3
* By Jackie http://www.themeke.com/
* @param string $name
* @param string $value
* @param int $expire
* @param string $path
* @param string $domain
* @param bool $secure
* @param bool $httponly
* @param string $samesite
* @return void
*/
function setTkCookie($name,$value,$expire,$path,$domain,$secure,$httponly,$samesite):void
{
if (PHP_VERSION_ID < 70300) {
setcookie($name, $value, $expire, $path . '; samesite=' . $samesite, $domain, $secure, $httponly);
return;
}
setcookie($name, $value, [
'expires' => $expire,
'path' => $path,
'domain' => $domain,
'samesite' => $samesite,
'secure' => $secure,
'httponly' => $httponly,
]);
}