原始回答
我终于找到了答案,看到Chrome团队成员写的这篇关于CORS-RFC1918的RFC文档。简而言之,Chrome已经实现了CORS-RFC1918,阻止公共网络资源请求私有网络资源 - 除非公共网络资源是安全的(HTTPS)并且私有网络资源提供适当(尚未定义的)CORS头信息。
此外,您可以更改Chrome标志以暂时禁用新行为:
chrome://flags/#block-insecure-private-network-requests
禁用该标志意味着您重新打开Chrome新行为旨在关闭的安全漏洞。
2021年更新:在我发布这个问题几个月后,我原始回答中提到的标志被删除了,因此我不得不通过使用HTTPS提供资产来更加令人满意地解决问题。
2022年更新:Chrome 98发布了,并引入了对Preflight requests的支持。根据公告,失败的请求应该会产生警告并且没有其他影响,但在我的情况下,它们是完整的错误,导致我的开发站点出现问题。所以我不得不添加中间件来教webpack-dev-server
如何提供预检请求。
Private Network Access(以前称为CORS-RFC1918)是一个规范,禁止从较不私密的网络资源向更私密的网络资源发出请求。例如HTTP到HTTPS,或远程主机到localhost。
最终的解决方案是添加自签名证书和中间件,使得可以从我的远程开发服务器对我的本地webpack-dev-server
进行资产请求。
生成证书
cd path/to/.ssl
npx mkcert create-cert
配置 webpack-dev-server
使用证书并提供预检请求服务
module.exports = {
devServer: {
https: {
key: readFileSync("./.ssl/cert.key"),
cert: readFileSync("./.ssl/cert.crt"),
cacert: readFileSync("./.ssl/ca.crt"),
},
allowedHosts: ".example.dev",
setupMiddlewares(middlewares, devServer) {
devServer.app.options('*', (req, res) => {
if (/^https:\/\/example\.dev$/.test(req.headers.origin)) {
res.set({
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Private-Network": "true",
"Access-Control-Allow-Origin": req.headers.origin,
})
res.sendStatus(200)
}
}
return middlewares
}
}
}
信任证书
- 在Windows资源管理器中右击
ca.crt
并选择安装证书
- 选择当前用户
- 选择将所有证书放入下列存储,然后浏览...,并选择受信任的根证书颁发机构
- 完成。
Firefox特定说明
默认情况下,Firefox不会尊重您的权威!请按照以下步骤进行配置:
- 在地址栏中输入
about:config
- 搜索
security.enterprise_roots.enabled
- 将设置切换为
true