而不是这样
<?php setcookie( "TestCookie", $value, time()+(60*60*24*30) ); ?>
您可以这样
<?php setcookie( "TestCookie", $value, strtotime( '+30 days' ) ); ?>
而不是这样
<?php setcookie( "TestCookie", $value, time()+(60*60*24*30) ); ?>
您可以这样
<?php setcookie( "TestCookie", $value, strtotime( '+30 days' ) ); ?>
想要删除 Cookie 吗?
许多人以复杂的方式做到这一点
setcookie('name', 'content', time()-3600);
但是为什么要这么复杂,并且冒着它无法工作的风险呢?如果客户端的时间不正确怎么办?为什么要摆弄 time();
这是取消设置 Cookie 的最简单方法
setcookie('name', 'content', 1);
就是这样。
只是一个例子来说明数组选项的使用,特别是由于 Mozilla 将弃用/处罚 SameSite = none 的使用,如果不使用数组选项,则默认情况下会使用该选项。
<?php
$arr_cookie_options = array (
'expires' => time() + 60*60*24*30,
'path' => '/',
'domain' => '.example.com', // 兼容性前导点或使用子域
'secure' => true, // 或 false
'httponly' => true, // 或 false
'samesite' => 'None' // None || Lax || Strict
);
setcookie('TestCookie', 'The Cookie Value', $arr_cookie_options);
?>
在任何 Web 浏览器中,都存在一个非常常用的选项“打开以前的窗口和选项卡”,默认情况下该选项处于禁用状态,但许多人会启用它。
当此选项处于活动状态时,Web 浏览器在关闭和重新打开时,不会执行终止并启动新会话的操作,而是会保存并恢复当前会话以及会话 Cookie 和 sessionStorage。
与预期相反,会话 Cookie 和 sessionStorage 都可以存在很长时间,直到用户在关闭 Web 浏览器之前关闭选项卡。
如果您希望 Cookie(例如带有时间偏移的 Cookie)保证具有较短的生命周期,则应明确指定此较短的生命周期,而不是依赖于会话 Cookie 上的自删除。
注意,在设置“数组 Cookie”时,每个数组元素都会设置一个单独的 Cookie。
在高流量网站上,这会大大增加客户端后续 HTTP 请求的大小(包括对同一域名上静态内容的请求)。
更重要的是,Cookie 规范指出浏览器只需要接受每个域名的 20 个 Cookie。Firefox 将此限制提高到 50 个,Opera 提高到 30 个,但 IE6 和 IE7 仍然执行每个域名 20 个 Cookie 的限制。超出此限制的任何 Cookie 都会替换掉较旧的 Cookie 或被浏览器忽略/拒绝。
值得一提的是:您应该避免在 Cookie 名称中使用点。
<?php
// 这实际上会设置名为 'ace_fontSize' 的 Cookie:
setcookie( 'ace.fontSize', 18 );
?>
这里没有明确说明的一点让我困惑了一段时间,那就是域名必须包含至少两个点(.),因此'localhost'是无效的,浏览器会拒绝设置Cookie!对于localhost,您应该使用false。
要使您的代码在localhost和正确的域名上都能工作,您可以这样做
<?php
$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('cookiename', 'data', time()+60*60*24*365, '/', $domain, false);
?>
如果要删除域中的所有 Cookie,您可能希望使用以下值
<?php $_SERVER['HTTP_COOKIE'] ?>
而不是
<?php $_COOKIE ?>
来确定 Cookie 名称。
如果 Cookie 名称采用数组表示法,例如:user[username]
那么 PHP 会自动在 $_COOKIE 中创建相应的数组。请改用 $_SERVER['HTTP_COOKIE'],因为它反映了实际的 HTTP 请求头。
<?php
// 取消设置 Cookie
if (isset($_SERVER['HTTP_COOKIE'])) {
$cookies = explode(';', $_SERVER['HTTP_COOKIE']);
foreach($cookies as $cookie) {
$parts = explode('=', $cookie);
$name = trim($parts[0]);
setcookie($name, '', time()-1000);
setcookie($name, '', time()-1000, '/');
}
}
?>
警告:如果您使用 URL 重写规则将类似 domain.com/bla/stuf/etc 这样的内容转换为参数,则在设置 Cookie 时可能会遇到问题。
至少在我的设置中,其中一个参数的更改会导致 Cookie 不再“存在”。
解决方法很简单:指定域名。'/' 通常可以正常工作。
" PHPSESSID " Cookie 将很快被拒绝,因为它 的 " sameSite " 属性设置为 " none " 或无效值,并且没有 " secure " 属性。要了解有关 "sameSite" 属性的更多信息,请访问 https://mdn.org.cn/docs/Web/HTTP/Headers/Set-Cookie/SameSite.
<?php
ini_set("session.cookie_secure", 1);
session_start();
我的 PHP 代码 ....
?>
请注意,$_COOKIE 变量不会保存具有相同名称的多个 Cookie。在同一主机上设置两个具有相同名称但子域名不同的 Cookie 是合法的。
<?php
setcookie("testcookie", "value1hostonly", time(), "/", ".example.com", 0, true);
setcookie("testcookie", "value2subdom", time(), "/", "subdom.example.com", 0, true);
?>
浏览器发出的下一个请求将在 $_SERVER['HTTP_COOKIE'] 变量中包含这两个 Cookie,但只有其中一个会在 $_COOKIE 变量中找到。对 subdom.example.com 的请求将包含这两个 Cookie,而对 example.com 或 www.example.com 的浏览器请求只会发送具有 "value1hostonly" 值的 Cookie。
<?php
$kaker = explode(";", $_SERVER['HTTP_COOKIE']);
foreach($kaker as $val){
$k = explode("=", $val);
echo trim($k[0]) . " => " . $k[1];
}
// 输出
testcookie => value1hostonly
testcookie => value2subdom
?>
Cookie 名称中的句点(如 user.name)似乎在 $_COOKIE 数组中显示为下划线(因此为 user_name)。这意味着例如必须使用 $_COOKIE["user_name"] 来读取使用 setcookie("user.name" ...) 设置的 Cookie,这已经相当令人困惑。
此外,变量 $_COOKIE["user_name"] 将保留由 setcookie("user.name" ...) 设置的值,并且无论调用多少次 setcookie("user_name" ...) 也不会更改此值。这可以通过清除 "user.name" Cookie 来轻松修复,但可能需要一段时间才能意识到这一点,因为 $_COOKIE 中只有 "user_name"。
希望这能为某些人节省一些时间。