为什么Chrome里即使预检请求失败了,实际的请求还是会发出?

当我在别的网站下发送请求给我本地的主机的时候,即使预检请求失败了,真实的请求还是会发出。不管是fetch发出的,还是用$.ajax发出的,不过只在请求方法是get或者post的时候会这样,如果是put之类的方法,那么在预检请求失败之后,真实的请求就不会发出了。

我不知道这是否和Chrome的private-network-access-preflight策略(https://developer.chrome.com/blog/private-network-access-pref...)有关。但是在官方文档里也明确说了,服务器得正常回复真实请求才会发出:
image.png

阅读 4.4k
2 个回答

不确定是不是这个头影响了Access-Control-Allow-Methods,这个字段表示服务端允许哪些跨域请求,也涉及到了私有网络请求。一般就是这几个方法GET,POST,OPTIONSPUT可能就直接不在里面,确认下这个是不是导致真实请求没有发送的原因。

image.png

看了下Fetch规范中明确了,即使存在跨域或私有网络请求,GET/POST/HEAD都属于在CORS的安全列表内,也就是推荐你在存在跨域的情况下使用这3个方法而不是其他DELETE/PUT之类的。现在来看即使Access-Control-Allow-Methods不设置,也不管预检请求结果如何,这3个方法应该都是被浏览器判定为安全的,大概率是因为这个原因。

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题