php代码,如何控制Cookie的SameSite属性变化?
发布于 作者:苏南大叔 来源:程序如此灵动~

主题依然是cookie
的SameSite
属性,载体变成php
。使用PHP
如何控制Cookie
的SameSite
属性?setcookie()
不能设置samesite
属性,该怎么办?这些是本文要探讨的问题。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,chrome@135.0.7049.41
,php@8.2.9nts
。SameSite
属性主要用于限制cookie
的访问范围。
php写cookie
前文回顾:
可用的写法有:
setcookie();
setrawcookie();
header("Set-Cookie:")
setcookie()
下面的写法是错误的:
setcookie('c1', 'cookie_value1', 1744270290, '/', 'v', false, true, 'samesite=strict')
正确的方式:
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
所以,为了设置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
相关文章,请参考:


