Heroku stack从18升级至20后登录失效,Login cookies未设置问题
问题根因定位
- Heroku Stack 20 反向代理配置变更:Stack 20 路由层默认将所有外部HTTPS请求降级为HTTP协议转发到应用实例,Express 官方默认不信任反向代理传递的
X-Forwarded-*头,会将生产环境请求误判为非安全HTTP请求 - Session Cookie 配置冲突:若你为生产环境的 Session Cookie 开启了
secure: true配置,Express 会因误判当前请求为非安全协议,拒绝下发 Cookie 到浏览器 - 跨域部署场景下的 SameSite 校验拦截:Stack 20 对应的默认 Node 运行时会启用更严格的 Cookie 同源校验规则,若前后端分属不同域名部署,未显式配置 SameSite 属性会导致浏览器主动拦截下发的 Cookie
解决方案
1. 开启 Express 代理信任配置
在 Express 入口文件的最顶部(所有路由、Session 中间件注册之前)添加如下配置,允许信任 Heroku 的第一层反向代理:
app.set('trust proxy', 1);
2. 适配生产环境 Session Cookie 规则
调整express-session中间件的 Cookie 配置,匹配 Heroku 生产环境要求:
app.use(session({ secret: process.env.SESSION_SECRET, // 保留你原有密钥配置 resave: false, saveUninitialized: false, cookie: { secure: process.env.NODE_ENV === "production", // 生产环境自动开启secure标记 sameSite: process.env.NODE_ENV === "production" ? "none" : "lax", // 跨域场景必须设为none,同域部署可改为lax httpOnly: true, maxAge: 7 * 24 * 60 * 60 * 1000 // 按需调整Cookie有效期,这里示例为7天 }, // 保留你原有的store、name等其他配置项 }));
3. 清理构建缓存重新部署
清除 Heroku 上残留的 Stack 18 构建缓存,避免旧配置干扰,本地终端执行如下命令:heroku builds:cache:purge -a 你的Heroku应用名称
执行完成后重新将代码推送到 Heroku 部署即可生效。
内容的提问来源于stack exchange,提问作者eriksjen
相关产品推荐
相关产品推荐

