奇妙的跨域错误-Access-Control-Request-Private-Network

问题背景:

当我本地运行服务时莫名其妙报了cors错误

  • 首先,我检查了响应标头是明确存在cors消息的
  • 然后检查了请求端是否包含了额外头部,没有
  • 然后对比了响应字段,都能对上

此时发现了一个神奇字段,请求表头中含有Access-Control-Request-Private-Network

Access-Control-Request-Private-Network: true

初步断定与该字段有关

问题解决:

资料参考:

  • https://stackoverflow.com/questions/72385682/access-control-request-private-network-header-issues
  • https://stackoverflow.com/questions/70292687/cors-for-private-networks-rfc1918-warning-on-call-to-local-service

参看stackof上的同类问题,我测试发现该问题确实目前只在chrome上出现。但是答案中加请求头的方案没有解决我的问题,我的请求依然不能正常发出

此时我找到了w3c关于该字段的描述:https://wicg.github.io/private-network-access/

本文档指定了对 Fetch 和 HTML 的修改,这些修改旨在减轻与客户端内部网络上的设备和服务器无意暴露给整个 Web 相关的风险。

根据这个描述,我猜测如果我的请求地址是以localhost开始的则不会发起预检请求,事实也确实如此。至此这个神奇的跨域消失了。变成了一个没有预检请求的普通请求。

内网请求时:
在这里插入图片描述

换成localhost后,预检请求消失:
![在这里插入图片描述](https://img-blog.csdnimg.cn/9e6b0549b3494ec592f5e0a2a214a6f2.png

问题总结:

目前看到产生该问题的场景都是内网之间测试时产生的
该字段用于防止用户代理无意中对运行在用户本地 Intranet 上的设备或直接在用户机器上运行的服务进行攻击。因此:

当其客户端是安全上下文并且对目标源的CORS 预检请求成功时,才允许私有网络请求。

可以解决的方案有:

  • 更改chrome相关配置
  • 不使用chrome
  • 更改请求地址,使其避开这个问题

可参考:

  • https://stackoverflow.com/questions/72385682/access-control-request-private-network-header-issues
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值