CORS 请求重定向失败
Posted
技术标签:
【中文标题】CORS 请求重定向失败【英文标题】:Redirect Failing on CORS Request 【发布时间】:2017-02-14 03:28:52 【问题描述】:我正在尝试使用 Box API 下载客户端 javascript 中的文件,一旦找到文件,它将请求重定向到临时下载链接。但是,浏览器阻止了重定向,引发以下错误:
XMLHttpRequest 无法加载 https://api.box.com/2.0/files/file-id/content。请求被重定向到“https://dl.boxcloud.com/d/1/some-big-hash/download”,这对于需要预检的跨域请求是不允许的。
在网络控制台中,我看到三个请求,第一个是带有 200 响应的 OPTIONS(它必须是飞行前的,因为实际代码发送一个 GET),第二个是相同的 GET 请求,都得到 302 'd(该 API 调用的预期响应)。这是发出请求的代码:
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('Authorization', 'Bearer '+MyToken);
xhr.onload = function()
//some stuff
xhr.onerror = function()
//some other stuff
xhr.send();
我的问题是 (a):为什么在预检返回后会发送两个 GET? 并且(b):有什么方法可以格式化请求以允许跟随重定向?并且 (c) 如果没有,我至少可以从响应中检索重定向 URL 并用另一个显式请求跟随它吗?控制台中的每个响应都设置了具有正确来源的“Access-Control-Allow-Origin”标头。
谢谢
【问题讨论】:
second two are identical GET requests
- 一切都一样?
@Maximus 请求/响应标头是相同的,我能看到的唯一区别是 Chrome 网络控制台的“启动器”列;一个说“api.box.com/2.0/files/file_id/content”(初始请求发送到的 URL),另一个说“Other”
和url一样吗?
是的(不要介意这需要达到最小字符限制)
【参考方案1】:
我不明白为什么您会收到三个而不是两个请求,但 CORS 迄今为止的工作方式是无法重定向带有预检的请求。这在 Fetch Standard 中有所改变,但用户代理尚未接受这一改变。
【讨论】:
知道为什么这里首先需要预检吗? “授权”是否被视为自定义标头? 是的,当您自己设置时,它肯定是。 fetch.spec.whatwg.org/#cors-safelisted-request-header 具有不需要预检的标头安全列表。以上是关于CORS 请求重定向失败的主要内容,如果未能解决你的问题,请参考以下文章
CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向
Google OAuth2:重定向已被 CORS 政策阻止:请求需要预检,不允许遵循跨域重定向
由于浏览器设置的标头,Safari 拒绝重定向 CORS 请求