PHP - 使用 header() 正确设置 cookie 参数(过期) - 而不是 set-cookie()

PHP - correctly set cookie parameters (expire) using header() - not set-cookie()

我们正在使用的站点是 运行 较旧的 HHVM 版本。 查看PHP函数setcookie()的文档,参数有两个签名。

总结一下我不能使用setcookie()的问题是因为这个版本没有使用PHP7.3的$options数组。当尝试通过将 samesite 连接到 path 来使用某些替代解决方案时,将 使 HHVM 崩溃。 使用正常 PHP 的替代方法可以正常工作,因为预期。

与 PHP.

相比,使用 cookie 的 HHVM 行为似乎略有不同

所以这个问题是关于 header() 而不是关于 setcookie() 因为我不能使用它, HHVM(版本 运行)处理 cookie 的方式略有不同。

注意:这是一个 Magento 1 站点 --- 升级到 HHVM 3.30+ 会中断 一切 所以这也不是一个选项 - 我试过了这已经.

所以我设法通过连接所有属性使用 header() 函数设置 cookie。

header('Set-Cookie: frontend=abcdef; expires=188888888; path=/; domain=www.mydomain.com; SameSite=None; Secure');

响应结果 Headers:

frontend=abcdef; expires=188888888; path=/; domain=www.mydomain.com; Secure; SameSite=None

Set-Cookie文档是指这个:

You may notice the expires parameter takes on a Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY HH:MM:SS GMT, this is because PHP does this conversion internally.

问题

样本:

php -a

php > $b = 3600 * 24 * 365;
php > $c = time() + $b;
php > echo $c;
1643355613
php > $dt = new DateTime();
php > $dt->setTimestamp($c);
php > echo $dt->format('Y-m-d H-i-s');
2022-01-28 09-40-13

不完全确定格式是否会被过期正确使用

这个问题涉及会话在某些情况下不起作用的问题,但我会将这些问题分开。

这是为了回答如何使用 header() 函数.

创建 raw set-cookie

因为setcookie()自动将时间戳更改为格式化字符串,所以这个转换必须自己完成。

Mozilla Set-Cookie 是这样说的:

The maximum lifetime of the cookie as an HTTP-date timestamp. See Date for the required formatting.

Mozilla Headers Date format显示要求的格式:

  Date: Wed, 21 Oct 2015 07:28:00 GMT

使用 header() functionset-cookie 创建格式正确的日期字符串:

// Assume current time + one day
$expires = time() + 60 * 60 * 24;
$dateTime = new DateTime();

// Set the timestamp
$dateTime->setTimestamp($expires);
// Set the timezone using a new DateTimeZone instance
$dateTime->setTimezone(new DateTimeZone('GMT'));
// Print the format.
// This format based on PHP DateTime formats - the 'e' switch adds the time zone at the end.
$format = 'D, d M Y H:i:s e';
$expiresText = $dateTime->format($format);

// Set the raw header with expires text (encode if needed)
header("Set-Cookie: cookieName=cookieValue; expires=$expiresText; samesite=None; Secure");

这应该给出一个 set-cookie,其中的日期格式已按要求设置。