我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

主题依然是cookieSameSite属性,载体变成php。使用PHP如何控制CookieSameSite属性?setcookie()不能设置samesite属性,该怎么办?这些是本文要探讨的问题。

苏南大叔:php代码,如何控制Cookie的SameSite属性变化? - php-cookie-samesite
php代码,如何控制Cookie的SameSite属性变化?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10chrome@135.0.7049.41php@8.2.9ntsSameSite属性主要用于限制cookie的访问范围。

php写cookie

前文回顾:

可用的写法有:

setcookie();
setrawcookie();
header("Set-Cookie:")

setcookie()

下面的写法是错误的:

setcookie('c1', 'cookie_value1', 1744270290, '/', 'v', false, true, 'samesite=strict') 

苏南大叔:php代码,如何控制Cookie的SameSite属性变化? - 设置代码一
php代码,如何控制Cookie的SameSite属性变化?(图3-2)

正确的方式:

function is_https() {
    return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || 
           (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
}

// 设置自定义 Cookie,包括 SameSite 属性
setcookie('MyCustomCookie', 'cookie_value', [
    'expires' => time() + 3600, // 1 小时后过期
    'path' => '/',
    'domain' => $_SERVER['HTTP_HOST'], // 动态设置域名
    'secure' => is_https(), // 根据是否 HTTPS 设置 secure 属性
    'httponly' => true, // 防止 JavaScript 访问
    'samesite' => 'Lax' // 设置 SameSite 属性
]);

使用header设置cookie

苏南大叔:php代码,如何控制Cookie的SameSite属性变化? - header设置samesite
php代码,如何控制Cookie的SameSite属性变化?(图3-3)

所以,为了设置SameSite属性,也可以使用header('set-cookie:'),并且要注意第二个参数为false,否则只能同时输出一个cooke设置语句。

改进版的代码如下:

// 判断是否为 HTTPS 的函数
function is_https() {
    return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || 
           (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
}

// 构造 cookie 选项字符串的函数
function build_cookie_options($name, $value, $samesite) {
    // 调用 is_https 函数
    $is_https = is_https();

    // 构造 cookie 选项
    $options = [
        'Expires' => gmdate('D, d M Y H:i:s T', time() + 3600), // 格式化为 HTTP 日期字符串
        'Path' => '/',
        'Domain' => $_SERVER['SERVER_NAME']
    ];

    // 动态添加 Secure 和 HttpOnly 属性
    $secure_flag = $is_https ? '; Secure' : '';
    $httponly_flag = '; HttpOnly';

    // 构建基础选项字符串
    $options_str = "Expires={$options['Expires']}; Path={$options['Path']}; Domain={$options['Domain']}; SameSite=$samesite";
    $options_str .= $secure_flag . $httponly_flag;

    // 返回完整的 Set-Cookie 字符串
    return "$name=" . urlencode($value) . "; " . $options_str;
}

// 设置不同的 SameSite 和值的 cookie
header("Set-Cookie: " . build_cookie_options("c1", "cookie_value1", "Strict"), false);
header("Set-Cookie: " . build_cookie_options("c2", "cookie_value2", "Lax"), false);

// 仅在 HTTPS 时设置 SameSite=None 的 cookie
if (is_https()) {
    header("Set-Cookie: " . build_cookie_options("c3", "cookie_value3", "None"), false);
}

结语

如果本地测试的目的的话,可以通过浏览器的开发者工具,来修改这个cookie。但是如果是线上的话,就必须服务器端代码来进行改写了。

更多cookie相关文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    cookie