为何前端Fetch调用REST API遇CORS错误,curl调用却正常?
为什么前端fetch请求REST API报CORS错误,但curl/PowerShell调用正常?
CORS是浏览器独有的安全限制
浏览器为了防范恶意网站盗用用户数据,有一套同源策略:只有请求的协议、域名、端口和当前页面完全一致时,才允许跨域请求。如果你的前端页面和目标API不在同一个源,浏览器就会触发CORS校验,直接拦截响应。而PowerShell/CMD里的curl是在终端环境发起请求,根本不受浏览器的同源策略和CORS规则约束,所以能正常拿到结果。CORS有专属的预检检查流程
浏览器发起跨域请求前,会自动发一个OPTIONS预检请求给API服务器,确认是否允许当前源的请求。如果服务器没返回正确的CORS响应头(比如Access-Control-Allow-Origin),或者返回的规则和当前请求不匹配,浏览器就会抛出CORS错误——但其实这时候服务器已经处理了请求,只是浏览器不让前端拿到数据而已。curl这类工具不会自动发这个预检请求,直接发送实际请求,服务器返回什么就接收什么,自然不会被拦截。请求携带的凭证差异
浏览器发起请求时,会自动带上当前页面的Cookie、本地存储等凭证(如果请求开启了credentials: include),这也是CORS检查的一部分。如果服务器没配置允许携带凭证,也会触发错误。而终端里的curl默认不会携带浏览器的这些凭证,请求更“干净”,不会触发这类限制。
更新:有人建议参考的旧问题年代久远(提及IE7),答案表述不够清晰;而本主题下的答案对我而言更易懂。
内容的提问来源于stack exchange,提问作者nonlinear
相关产品推荐
相关产品推荐

