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.
问题
如何正确设置 expires 值,因为我正在创建 raw header使用 setcookie()
UNIX 时间戳将在 cookie 中,如上所示,换句话说 setcookie()
在内部转换 UNIX 时间戳...
我也尝试了以下方法 - 但我不确定这对 expires
是否正确:需要什么格式?
样本:
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() function
为 set-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
,其中的日期格式已按要求设置。
我们正在使用的站点是 运行 较旧的 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.
问题
如何正确设置 expires 值,因为我正在创建 raw header使用
setcookie()
UNIX 时间戳将在 cookie 中,如上所示,换句话说setcookie()
在内部转换 UNIX 时间戳...我也尝试了以下方法 - 但我不确定这对
expires
是否正确:需要什么格式?
样本:
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()
函数.
因为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() function
为 set-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
,其中的日期格式已按要求设置。