重定向后浏览器不会从带有 www 的域发送 cookie
Posted
技术标签:
【中文标题】重定向后浏览器不会从带有 www 的域发送 cookie【英文标题】:Browser doesn't send the cookie from domain with www after redirect 【发布时间】:2020-07-19 20:28:12 【问题描述】:我的网站有一个临时版本,它是beta.example.com
。我最近使用以下设置添加了 cookie 身份验证:
response.cookie(tokenName, token,
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000))
)
在暂存身份验证工作中。
当我将代码部署到生产环境时,cookie 已成功设置(通过 Set-Cookie
标头),但未在服务器端请求中发送到服务器。因此,当我刷新登录状态时,它会消失,但会保留在客户端请求中。
值得注意的是,有一个从example.com
到www.example.com
的301 重定向。 host
标头在生产中也是 www.example.com
。
我最终通过在设置cookie时添加domain
参数解决了这个问题,如下所示:
response.cookie(tokenName, token,
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000)),
domain: '.example.com'
)
但是我并不完全理解问题的根源。根据MDN
域指定允许的主机接收 cookie。如果未指定,则默认为当前文档位置的主机,不包括子域。如果指定了域,则始终包含子域。
因此,当我在没有明确设置 domain
的情况下使用 beta.example.com
进行暂存时,根据 MDN,隐式 domain
将是 example.com
,而 beta.example.com
将被排除在外。但是身份验证确实在暂存中起作用!
但是我在生产中遇到了与 www.example.com
相同的情况,那为什么它在生产中不起作用?
这是执行重定向的 nginx 配置:
server
listen 80 default_server;
server_name beta.example.com;
location /
include proxy_pass.inc;
server
listen 80 default_server;
server_name www.example.com;
location /
include proxy_pass.inc;
server
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
【问题讨论】:
【参考方案1】:我相信你误解了MDN documentation。
如果未指定,则默认为当前文档位置的主机,不包括子域。
意思是如果你在beta.example.com
,那么Domain
将被设置为值beta.example.com
。这将从其他子域排除 cookie。
如果您想在所有子域上使用 cookie,您必须明确设置 Domain
。
【讨论】:
以上是关于重定向后浏览器不会从带有 www 的域发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章
NGINX 将 http 重定向到 https,将非 www 重定向到 ww