You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用express-session时Set-Cookie Header缺失,无法登录如何解决?

核心原因

你的Express服务配置了cookie.secure: true,这要求只有HTTPS请求才会发送Session Cookie,但Nginx反向代理未将客户端的HTTPS请求信息传递给后端Express,导致Express判断当前请求为HTTP,因此不会输出Set-Cookie头。同时,Express默认不信任代理传递的头信息,需要显式开启信任配置。

解决方案

1. 修改Nginx反向代理配置

在location块中添加两个代理头,将HTTPS请求的标识传递给后端:

location ^~ /
{
  proxy_pass http://127.0.0.1:3000;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header REMOTE-HOST $remote_addr;
  # 添加以下两行
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Forwarded-Ssl on;

  # 其余原有配置保持不变...
}

2. 修改Express Session配置

在expressSession选项中添加proxy: true,让Session模块信任代理传递的X-Forwarded-Proto头,从而正确识别HTTPS请求:

import * as expressSession from 'express-session';

app.use(
  expressSession({
    secret: process.env.SES_SCRET, // 注意:此处变量名拼写为SES_SCRET,建议检查是否应为SES_SECRET
    cookie: {
      httpOnly: true,
      maxAge: sessionAge,
      sameSite: 'none',
      secure: true
    },
    store: sessionStore,
    name: 'LID',
    resave: false,
    saveUninitialized: false,
    proxy: true // 添加这一行
  })
);

或者也可以在Express应用全局开启信任代理:

app.set('trust proxy', true);

3. 额外检查项

  • 确认新服务器的环境变量SES_SCRET(或正确拼写的SES_SECRET)已正确配置,旧服务器正常可能是因为环境变量正确,新服务器未配置导致Session初始化失败。
  • 确保Nginx已正确配置HTTPS(SSL证书),否则客户端请求本身不是HTTPS的话,sameSite: 'none'和secure: true的组合也会导致浏览器拒绝接收Cookie。

内容的提问来源于stack exchange,提问作者ryanhex53

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:53:11