这类问题我又碰上了一次。站点切到 HTTPS 后给 Cookie 加了 Secure 属性,微信内置浏览器里用户登录后跳两下就变成未登录,nginx 日志中 302 在 https 与 http 之间来回跳。

第一反应是「Cookie 的 SameSite 设成 Strict,微信内的跳转回来时浏览器不带 Cookie」,验证下来不成立。

原因不止一个,得分开看。页面里还有 http 的静态资源,Cookie 带上 Secure 后 http 请求不再携带,会话中断;反向代理没透传 X-Forwarded-Proto,应用以为当前是 http,Cookie 又被置成非 Secure;域名有 www 与不带 www 两个,Cookie 的 Domain 只写了其中一个。

动手时先看响应头里 Set-Cookie 的完整属性

curl -sI https://www.example.com/login | grep -i set-cookie

再往下确认代理透传了协议头

curl -sI https://www.example.com/ | grep -i x-forwarded-proto

然后统一 301 到 https 并补齐协议头

printf 'proxy_set_header X-Forwarded-Proto $scheme;\n' > /etc/nginx/conf.d/proxy.conf && nginx -s reload

末了登录后核对会话是否保持

curl -s -c /tmp/c.txt -b /tmp/c.txt https://www.example.com/user | head -5

怎么算真的好了,看的是同一批现象。登录后连续访问三个页面都返回已登录状态,Cookie 带有 Secure 与正确的 Domain,日志里不再出现 http 与 https 之间的 302。

Secure 只影响是否随请求发送,不改写值,排查要看请求头里到底有没有带上;反向代理场景下应用判断协议一律依赖 X-Forwarded-Proto。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189