Chrome启用实验特性后localhost跨域预检失败,改用IP正常的问题咨询
跨域请求localhost失败问题解答
问题背景
环境配置
- Chrome v106浏览器,已启用
flags中的"Experimental Web Platform features"特性 - 本地Chrome访问域名
remote - 本地运行基于.NET Framework的HTTP监听器,监听地址为
http://localhost:8850
问题现象
当remote域名下的JS发起向http://localhost:8850/Data的请求时,预检请求失败,报错:
net::err_failed,具体提示为:"Access to fetch at 'http://localhost:8850/Data' from origin 'http://remote' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space
local."
将请求地址及服务器监听器配置中的localhost改为本地实际IP后,预检请求可正常通过。
疑问
- 为何改用IP可正常工作?
- 是否有办法让localhost也能正常使用?
- 禁用该Chrome实验特性则无此问题,该特性的具体变更内容是什么?
解答
1. 改用IP可行的原因
Chrome的私有网络访问控制机制会对地址空间做分层限制:
localhost被划分为最高风险的local地址空间,属于本地环回资源- 本地内网IP(如
192.168.x.x)属于private地址空间,风险等级更低
非安全上下文的外部域名(remote是普通HTTP域名,不属于安全上下文)请求local空间资源会被直接拦截;而请求private空间的限制更宽松,因此改用IP后可通过预检。
2. 让localhost正常工作的方案
有几种可行方式:
- 升级
remote为安全上下文:将remote部署为HTTPS协议,安全上下文下浏览器允许向local地址空间发起跨域请求 - 修改Chrome启动参数:添加
--disable-features=PrivateNetworkAccessCheck,直接关闭私有网络访问检查机制 - 配置CORS响应头(配合HTTPS):如果
remote是HTTPS,服务器端返回Access-Control-Allow-Origin: https://remote,可选额外添加Access-Control-Allow-Private-Network: true明确允许私有网络访问
3. "Experimental Web Platform features"特性的核心变更
该实验特性主要落地了**私有网络访问控制(Private Network Access)**规则,核心变更包括:
- 把网络地址分为
public(公网)、private(内网IP)、local(localhost/环回地址)三个风险层级 - 限制非安全上下文的外部域名,不能向更私有层级的地址发起跨域请求(如公网域名→localhost)
- 新增预检请求的校验逻辑,强制检查请求上下文的安全性和目标地址的私有等级
- 仅安全上下文(HTTPS、localhost自身页面)可不受限制地访问
local或private地址空间的资源
内容的提问来源于stack exchange,提问作者Dries
相关产品推荐
相关产品推荐

