POST请求正常但PUT请求触发CORS跨域错误如何解决
问题原因
你的POST请求属于CORS简单请求范畴,满足简单请求条件的请求不会触发预检流程,只要后端响应头加了Access-Control-Allow-Origin就能正常执行,和你当前的表现一致。
而PUT属于非简单请求,浏览器会先发送OPTIONS预检请求,确认后端允许跨域使用PUT方法、允许对应请求头之后,才会发送实际的PUT请求。你当前的问题根源是后端API没有正确处理OPTIONS预检请求,或者CORS配置中没有允许PUT方法,才会触发CORS报错。你之前尝试的前端层面改no-cors模式、安装CORS浏览器扩展都无法解决本质问题。
解决方案
所有操作都在你的后端API服务上配置,前端不需要修改CORS相关逻辑:
- 首先在CORS配置的允许方法列表里加上
PUT(如果你后续要把删除逻辑改成符合REST规范的DELETE方法,也要对应加上DELETE),不要只配置GET、POST两个方法 - 单独处理OPTIONS类型的请求:所有路由收到OPTIONS请求时,直接返回包含以下响应头的200/204响应,不要走业务校验逻辑:
Access-Control-Allow-Origin: 你的前端域名(开发环境可以临时写*方便调试) Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type, Accept Access-Control-Max-Age: 86400 - 实际业务请求(PUT/POST/GET等)的响应头也要带上
Access-Control-Allow-Origin,取值和你的前端域名匹配
前端优化建议(可选)
按RESTful API规范,删除资源应该使用DELETE方法而非PUT,你可以根据自己后端的路由设计调整,调整后记得同步更新后端CORS配置里的允许方法列表即可。
内容的提问来源于stack exchange,提问作者abrush
相关产品推荐
相关产品推荐

