CORS跨域预检preflight请求错误

本文介绍了前端在请求跨域接口时遇到的CORS预检请求错误,焦点在于服务器响应中Pragma头被禁止的问题。文章解释了预检请求的作用,并提供了在Nextwork中处理此问题的方法。
摘要由CSDN通过智能技术生成

一、问题描述

前端在请求跨域接口时,可能会遇到一种错误,类似于:

Access to fetch at 'http://xxx.com/index' from origin 'http://yyy.com' has been blocked by CORS policy: Request header field pragma is not allowed by Access-Control-Allow-Headers in preflight response.

在Network面板上,你还会发现会似乎有两条一样的请求:
在这里插入图片描述

其中,可以明显看到多了一个preflight类型的请求。

二、问题排查

预检请求(preflight)在跨域请求中是比较常见的:

在这里插入图片描述

1.CORS 预检请求(CORS Preflight request)介绍

CORS 预检请求是用于检查服务器是否支持 CORS 即跨域资源共享。

它一般是用了以下几个 HTTP 请求首部的 OPTIONS 请求:Access-Control-Request-Method 和 Access-Control-Request-Headers,以及一个 Origin 首部。

在这里插入图片描述

当有必要的时候,浏览器会自动发出一个预检请求;所以在正常情况下,前端开发者不需要自己去发这样的请求。

举个例子,一个客户端可能会在实际发送一个 DELETE 请求之前,先向服务器发起一个预检请求,用于询问是否可以向服务器发起一个 DELETE 请求:

OPTIONS /resource/foo
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: origin, x-requested-with
Origin: https://foo.bar.org

如果服务器允许,那么服务器就会响应这个预检请求。并且其响应首部 Access-Control-Allow-Methods 会将 DELETE 包含在其中:

HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400

这里可能会有个疑惑:CORS跨域预检请求在什么情况下才会触发?这个后续文章再进行探究。

2.问题原因

在Nextwork中模拟一下跨域请求:
在这里插入图片描述

Request header field pragma is not allowed by Access-Control-Allow-Headers in preflight response.

这就是因为在跨域预检请求的响应中并不允许携带pragma 请求头。

只要把pragma 请求头移除即可:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓风伴月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值