expires属性不生效的根本原因是格式必须严格符合RFC 7231的GMT字符串(如Fri, 31 Dec 2099 23:59:59 GMT),若解析失败或时间为过去值,浏览器将静默忽略并退化为session cookie;推荐优先使用max-age(秒数),其优先级高于expires且不依赖客户端时钟。

Cookie的expires属性根本不会生效?
直接写 document.cookie = "name=value; expires=Fri, 31 Dec 2099 23:59:59 GMT" 并不能保证 Cookie 存活到那个时间——浏览器会严格校验时间格式,且只接受 GMT(不是本地时区,也不是 ISO 格式)。常见错误是传入 "2099-12-31" 或 new Date().toString(),结果 Cookie 立即失效或变成 session cookie。
真正起效的前提是:
-
expires值必须是符合 RFC 7231 的 GMT 时间字符串(例如Fri, 31 Dec 2099 23:59:59 GMT) - 时间必须是未来时刻;若解析失败或为过去时间,浏览器会静默忽略
expires,退化为 session cookie - 现代浏览器更推荐用
max-age(秒数),它不依赖客户端时钟,优先级高于expires
用new Date().toUTCString()生成合法expires值
手动拼接时间字符串极易出错。最稳妥的方式是让 JS 帮你生成标准 GMT 字符串:
const date = new Date(); date.setTime(date.getTime() + 7 * 24 * 60 * 60 * 1000); // 7天后 document.cookie = "theme=dark; expires=" + date.toUTCString() + "; path=/";
注意三点:
立即学习“前端免费学习笔记(深入)”;
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
-
toUTCString()输出格式固定为Wed, 01 Jan 2025 00:00:00 GMT,完全合规 - 别用
toISOString()或toLocaleString(),它们格式不被识别 - 设置时务必带上
path=/(或匹配的实际路径),否则读取时可能因路径不一致而找不到 Cookie
expires和max-age共存时谁说了算?
如果同时指定两者,max-age 优先级更高,expires 被忽略。例如:
document.cookie = "token=abc; expires=Fri, 01 Jan 2030 00:00:00 GMT; max-age=3600";
这个 Cookie 实际只存活 1 小时,哪怕 expires 写的是 2030 年。原因在于:
-
max-age是 HTTP/1.1 标准字段,语义明确(单位:秒) -
expires是旧版 HTTP/1.0 兼容字段,依赖客户端时间,可靠性低 - 服务端 Set-Cookie 响应头中两者都出现时,浏览器以
max-age为准;前端 JS 设置时同理
设置过期时间后依然“消失”的真实原因
即使 expires 格式正确、时间有效,Cookie 还是没撑到设定时间,大概率是以下情况:
- 用户清除了浏览器数据(包括 Cookie),或启用了“退出时清除 Cookie”选项
- Cookie 被标记为
Secure但当前页面是http://,导致设置失败(控制台无提示) - 域名不匹配:
domain设置了.example.com,但当前页是sub.example.com且未显式声明domain,部分浏览器拒绝写入 - 第三方 Cookie 限制:跨站上下文(如 iframe)中,Chrome/Safari 默认阻止非用户交互触发的 Cookie 写入
调试时打开浏览器开发者工具的 Application → Cookies 面板,确认条目是否存在、Expires 列是否显示具体时间(而非 Session),这是唯一可信依据。


















