为何浏览器将localhost子域间请求标记为sec-fetch-site:cross-site?
核心原因:localhost 是浏览器特殊处理的顶级域
你遇到的问题根源在于浏览器对 localhost 这个特殊域的处理逻辑——它的子域名不会被识别为同一站点(same-site)的一部分。
虽然文档里描述same-site包含“相同协议、域名和/或子域名”,但这个规则仅适用于常规的公共顶级域(比如 .com、.org)。对于 localhost,浏览器会将每个子域(如 fe.localhost 和 be.localhost)视为完全独立的站点,因此跨子域的请求会被标记为 cross-site。
补充验证与说明
你可以通过浏览器开发者工具的「网络」面板查看请求头中的 Sec-Fetch-Site 字段,确认确实被标记为 cross-site。这种处理是浏览器的安全策略之一,目的是在本地开发场景下隔离不同的服务实例,避免潜在的跨站风险。
如果需要让这两个子域被视为same-site,你可以修改本地DNS配置(比如使用自定义的顶级域,如 .local),或者在浏览器的测试模式下调整相关安全设置,但前者是更通用的解决方案。
关于你的后端代码
你的PHP后端代码中已经设置了基础的CORS响应头(Access-Control-Allow-Headers),但如果要处理跨站请求的Cookie或会话(比如你的登录逻辑用到了session_start()),还需要补充设置 Access-Control-Allow-Origin 为前端域名(https://fe.localhost),并添加 Access-Control-Allow-Credentials: true,同时前端请求时要设置 withCredentials: true(如果用的是fetch或axios),否则会话无法跨域共享。
内容的提问来源于stack exchange,提问作者geoidesic

