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 请求

获取 API、自定义请求标头、CORS 和跨域重定向

从源 xxxx 访问 XMLHttpRequest ' 被 CORS 策略阻止:对预检的响应。预检请求不允许重定向

ReactJS 发送 GET 请求,响应 302 重定向,收到 CORS 错误