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

开启HTTPS的远程服务器上Express无法发送安全会话Cookie

解决express-session设置secure: true时不发送Set-Cookie的问题

核心原因

当cookie.secure设为true时,express-session仅会在HTTPS协议的请求中发送Set-Cookie响应头。如果Express没有检测到当前请求是HTTPS(比如通过反向代理转发的请求未传递HTTPS标识),就不会生成Cookie。

具体解决方案

1. 让Express信任反向代理的HTTPS标识

如果你的服务器使用了Nginx等反向代理,请求到达Express时实际是HTTP协议,需要配置Express信任代理传递的X-Forwarded-Proto头,以此识别原始请求的协议。

在代码中添加以下配置(放在app = express()之后):

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

2. 配置反向代理传递HTTPS标识(以Nginx为例)

确保Nginx配置中传递X-Forwarded-Proto头,告知Express原始请求的协议:

location / {
    proxy_pass http://localhost:3000;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
}

3. 直接用Express启动HTTPS服务(无反向代理场景)

如果不需要反向代理,可让Express直接加载Let's Encrypt证书,监听HTTPS端口:

const express = require('express')
const session = require('express-session')
const https = require('https');
const fs = require('fs');

const app = express()
app.set('trust proxy', true);

const sessionMiddleware = session({
    secret: 'secret',
    resave: false,
    rolling: true,
    saveUninitialized: false,
    cookie: {
        secure: true,
        httpOnly: false,
        maxAge: 1000 * 60 * 10 * 1000
    }
});

app.use(sessionMiddleware)

app.get('/', (req, res) => {
    req.session.foo = 'bar';
    res.send('Hello World!')
})

// 加载Let's Encrypt证书
const httpsOptions = {
    key: fs.readFileSync('/etc/letsencrypt/live/your-domain/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/your-domain/fullchain.pem')
};

https.createServer(httpsOptions, app).listen(443, () => {
    console.log('HTTPS server running on port 443');
});

4. 兼容多环境的自动判断(express-session v1.17.0+)

将secure设为'auto',它会在生产环境自动要求HTTPS,开发环境允许HTTP,无需手动切换配置:

cookie: {
    secure: 'auto',
    httpOnly: false,
    maxAge: 1000 * 60 * 10 * 1000
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:57:11