为何同域名子域请求的Sec-Fetch-Site被标记为cross-site?
问题原因及解决办法
核心原因:Heroku域名属于公共后缀列表
浏览器判断same-site的依据并非简单的父域名相同,而是公共后缀列表(Public Suffix List)。herokuapp.com被列入了这个列表,浏览器会将其视为「顶级公共后缀」,而非普通二级域名。这直接导致:
a.herokuapp.com和b.herokuapp.com被判定为完全独立的站点- 跨二者的请求自然会被标记为
cross-site
验证方式
你可以通过以下方式确认这一点:
- 在Chrome地址栏输入
chrome://settings/cookies/detail?site=herokuapp.com,查看Cookie域的处理逻辑,会发现浏览器将herokuapp.com当作顶级域对待 - 浏览器内置的公共后缀列表中确实包含
herokuapp.com条目
解决办法
如果需要让两个应用被判定为same-site,唯一可行的方案是使用自定义域名:
- 注册自己的顶级域名(比如
example.com) - 将两个应用分别配置为
a.example.com和b.example.com - 此时浏览器会将
example.com视为父域,跨子域的请求会被标记为same-site
附:你提供的请求头信息
… Host: b.herokuapp.com Origin: https://a.herokuapp.com Referer: https://a.herokuapp.com/ Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site …
内容的提问来源于stack exchange,提问作者s_joe77
相关产品推荐
相关产品推荐

