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


    问题背景:

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

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

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

    Access-Control-Request-Private-Network: true
    
    • 1

    初步断定与该字段有关

    问题解决:

    资料参考:

    • 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
  • 相关阅读:
    帝国CMS后台登录显示空白解决方法汇总
    网工内推 | 金融业,网络管理岗,CCIE优先,最高30k
    Python 线性查找
    【图论】SPFA求负环
    Insert or Merge
    全局滚动条样式修改,elementUI table底部滚动条遮挡
    Hadoop学习
    Java基础系列(七)——多线程
    主成分分析法(PCA)及其python实现
    TypeScript26(TS进阶用法Record & Readonly)
  • 原文地址:https://blog.csdn.net/riddle1981/article/details/126760339