这个问题在这里已有答案:

我想从网页上获取HTML

fetch("https://www.example.com/").then((response) => {
  let result = "";
  const reader = response.body.getReader();
  let htmlContent = "";
  ...
});

但是,我得到错误:

无法加载https://www.example.com:对预检请求的响应未通过访问控制检查:请求的资源上没有“Access-Control-Allow-Origin”标头 . 因此,不允许访问“https://www.someWebpage.com” . 如果不透明响应满足您的需要,请将请求的模式设置为“no-cors”以获取禁用CORS的资源 .

根据我的理解,当我在我的broswer中的命令提示符中执行代码时,还会发送原始页面以查看是否允许获取内容(CORS规则),而不是 .

我能够使用 curl "https://www.example.com" 获取带有此请求标头的html离开客户端:

=> Send header, 80 bytes (0x50)
0000: GET / HTTP/1.1
0010: Host: www.example.com
0028: User-Agent: curl/7.47.0
0041: Accept: */*
004e:

但是在Fetch api中设置这些 Headers 时

fetch("https://www.example.com/", {method: "GET", headers:{"Host":"www.example.com", "User-Agent":"HappyBot","Accept":"*/*"}}).then( ...

仍被CORB阻止 .

据我所知,我需要服务器通过设置正确的标头来信任我的请求 . 我需要设置什么标头?

编辑:请求是否被broswer本身阻止(因为Fetch API)而不是服务器?

出于安全原因,浏览器限制从脚本中发起的跨源HTTP请求 . 例如,XMLHttpRequest和Fetch遵循同源策略 . 因此,使用XMLHttpRequest或Fetch的Web应用程序只能向其自己的域发出HTTP请求 . 为了改进Web应用程序,开发人员要求浏览器供应商允许跨域请求 .

如果Fetch无法从随机网页获取HTML,则计划B将使用可以或计划C使用代理的其他API . 但是如果可能的话,希望用Fetch API来做 .

编辑2:发现它是不可行的broswers . 我想现在放弃计划A :(

https://www.html5rocks.com/en/tutorials/cors/

首先要注意的是,有效的CORS请求始终包含Origin标头 . 此Origin标头由浏览器添加,不能由用户控制 . 该 Headers 的值是请求源自的方案(例如http),域(例如bob.com)和端口(仅在它不是默认端口时包括,例如81);例如:http://api.alice.com .

该原始标头正在触发CORB