Nginx 必须配置 proxy_set_header X-Forwarded-Proto $scheme; 透传客户端协议,Echo 才能正确判断 HTTPS 上下文并使 Secure: true 生效;否则浏览器因协议不匹配会静默丢弃 Cookie。

必须设 secure=true,且确保反向代理透传 X-Forwarded-Proto
直接在 c.SetCookie() 里把 http.Cookie.Secure 设为 true 不够——如果请求实际走的是 HTTP(比如 Nginx 终止 SSL 后转发给 Echo 的是 HTTP),浏览器会拒绝接收这个 Cookie。关键在于:Secure 属性只在 HTTPS 上下文才被浏览器认可,而 Echo 本身不判断协议,只忠实地写 Header。
为什么 c.SetCookie(&http.Cookie{Secure: true}) 还是无效?
常见错误现象:
- 本地开发用
http://localhost:8080测试,却设了Secure: true→ 浏览器静默丢弃 Cookie - Nginx 配了 HTTPS,但没加
proxy_set_header X-Forwarded-Proto $scheme;→ Echo 认为自己跑在 HTTP 下,c.Request().TLS为 nil,部分中间件逻辑(如 session)可能误判 - 用了
middleware.HTTPSRedirect()但没放e.Pre()→ 重定向前已执行 handler,Cookie 已发出去
正确配置步骤(Nginx + Echo 场景)
1. Nginx 配置中必须透传协议头:
location / {
proxy_pass http://echo_backend;
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 X-Forwarded-Proto $scheme; # ← 关键!
}2. Echo 中启用 HTTPS 重定向(防止用户直连 HTTP 端口):
e.Pre(middleware.HTTPSRedirectWithConfig(middleware.RedirectConfig{
Code: http.StatusTemporaryRedirect, // 推荐 307,保留 POST 方法
}))3. 写 Cookie 时显式设 Secure: true 和 HttpOnly: true:
cookie := &http.Cookie{
Name: "session_token",
Value: "abc123",
Path: "/",
Domain: ".example.com", // 注意开头的点,支持子域
MaxAge: 3600,
Secure: true, // ← 必须
HttpOnly: true, // ← 强烈建议
SameSite: http.SameSiteLaxMode,
}
c.SetCookie(cookie)容易被忽略的细节
Cookie 的 Domain 值不能是 IP 或 localhost,否则 Secure 属性会被浏览器无视;SameSite 设为 Lax 或 Strict 才能配合 Secure 发挥作用;如果你用 session.Middleware(),它的默认存储器(如 FilesystemStore)不会自动加 Secure,必须手动传入 Options:
store := sessions.NewFilesystemStore("/tmp", []byte("secret"))
store.Options(sessions.Options{
Secure: true,
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
})
e.Use(session.Middleware(store))真正起作用的从来不是单个字段设置,而是 Nginx 头、Echo 重定向、Cookie 属性、Session 存储选项这四者对齐。漏掉任意一环,Secure 就形同虚设。


















