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

Heroku添加自定义域名后Cookie无法设置的解决问询

解决Heroku自定义域名下Cookie无法设置的问题

以下是针对你问题的具体修复方案,按优先级排序:

1. 修正CORS Origin配置

当前CORS的origin指向Heroku默认域名,而实际访问的是自定义域名www.mydomain.com,完全不匹配导致跨域Cookie无法传递。更新origin为你的自定义域名(注意不要带末尾斜杠):

app.use(
    cors({
        origin: "https://www.mydomain.com",
        credentials: true
    })
);

如果需要兼容裸域重定向场景,可改用动态判断逻辑:

app.use(
    cors({
        origin: function(origin, callback) {
            const allowedOrigins = ["https://www.mydomain.com", "https://mydomain.com"];
            if (!origin || allowedOrigins.includes(origin)) {
                callback(null, true);
            } else {
                callback(new Error("Not allowed by CORS"));
            }
        },
        credentials: true
    })
);

2. 为Cookie添加Domain属性

当前session的Cookie未指定作用域,裸域重定向到www域名后,Cookie的生效范围不匹配。添加domain属性,设置为.mydomain.com(允许裸域和www子域共享Cookie):

const sessionOptions = {
    store,
    name: 'c_ie',
    secret,
    resave: false,
    saveUninitialized: false,
    proxy: true,
    cookie: {
        httpOnly: true,
        sameSite: 'none',
        secure: true,
        domain: '.mydomain.com', // 关键新增配置
        expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
        maxAge: 1000 * 60 * 60 * 24 * 7
    }
}

3. 调整中间件加载顺序

trust proxy必须在session中间件之前设置,CORS需在路由处理前生效,正确顺序如下:

// 1. 先配置反向代理信任
app.set('trust proxy', 1);

// 2. 再加载CORS中间件
app.use(
    cors({
        origin: "https://www.mydomain.com",
        credentials: true
    })
);

// 3. 最后挂载session中间件
app.use(session(sessionOptions));

4. 检查Cloudflare SSL模式

Cloudflare的Flexible SSL模式会导致Cloudflare到Heroku的连接为HTTP,浏览器会拒绝secure: true的Cookie。登录Cloudflare后台:

  • 进入SSL/TLS -> Overview
  • 将SSL模式切换为Full

5. 验证域名解析与Heroku配置

确认Heroku应用设置中已添加www.mydomain.com和mydomain.com作为自定义域名,且Cloudflare的CNAME解析已生效(可通过dig www.mydomain.com命令验证)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:55:09