最近写东西的时候突然发现 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,
     ]);
 }