跨域请求在 Firefox 中被阻止

Posted

技术标签:

【中文标题】跨域请求在 Firefox 中被阻止【英文标题】:Cross Origin request blocked in Firefox 【发布时间】:2016-12-13 11:51:49 【问题描述】:

我的 Angular JS 应用程序的跨源请求在 Chrome 中可以正常工作,但在 Firefox 中无法正常工作。

firefox 收到的错误是:

跨域请求被阻止:同源策略不允许读取 https://api.domain.eu/join/joinstatus 的远程资源。 (原因: CORS 标头“Access-Control-Allow-Origin”不匹配 'https://www.domain.eu, https://www.domain.eu')。

在我向请求添加Authorization 标头之前,我可以成功发出请求。

我的服务器(在 IIS 上运行的 ASP.Net Web API)设置了以下标头:

Access-Control-Allow-Origin: https://www.domain.eu
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true

Firefox 使用 OPTIONS 请求成功地预检了请求。通过这个我可以看到发送的Origin 标头包含在返回的Access-Control-Allow-Origin 标头中。

事实上,由于某种原因,返回的Access-Control-Allow-Origin 标头有我的域名两次(尽管在配置中指定了一次)例如

Access-Control-Allow-Origin: https://www.domain.eu, https://www.domain.eu

除此之外,Firefox 和 Chrome 在这方面有什么区别?

我还需要做什么才能在 Firefox 中运行?

更新

我注意到如果我将标题设置如下...

`访问控制允许来源:https://www.domain.eu'

...然后飞行前OPTIONS 请求工作正常。 Access-Control-Allow-Origin 标头在 both 请求和响应中是相同的。然而,实际的GET 请求随后会因上述错误而失败。

如果我修改我的标题如下:

Access-Control-Allow-Origin: https://www.domain.eu, https://www.domain.eu

...(这是 Firefox 在错误中提到的内容),然后实际的飞行前 OPTIONS 请求失败,因为这次 Firefox 只期望在标头中有一个 https://www.domain.eu 值。

【问题讨论】:

请求中实际发送的Origin HTTP 标头的值是多少?从 Firefox 发送的请求有什么不同吗?您引用的错误消息似乎表明请求中的Origin 标头具有https://www.domain.eu, https://www.domain.eu,这永远不会发生。 Origin 标头应该是单一来源。 【参考方案1】:

试试:

Access-Control-Allow-Origin: https://www.domain.eu, https://domain.eu

Access-Control-Allow-Origin: https://*.domain.eu, http://*.domain.eu

Access-Control-Allow-Origin: domain.eu

Access-Control-Allow-Origin: *.domain.eu

编辑:

试试:

Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Request-Method: GET, POST, OPTIONS, PUT, DELETE

文档:

访问控制允许来源

返回的资源可能有一个 Access-Control-Allow-Origin 标头,语法如下:

Access-Control-Allow-Origin: <origin> | *

origin 参数指定一个可以访问资源的 URI。浏览器必须强制执行此操作。对于没有凭据的请求,服务器可以将* 指定为通配符,从而允许任何来源访问资源。

例如,要允许http://mozilla.com 访问资源,您可以指定:

Access-Control-Allow-Origin: http://mozilla.com

您只能指定一个 URI 或 *

【讨论】:

【参考方案2】:

这个问题是由于我的解决方案中的 NuGet 包组合错误造成的。 Owin 和 Web API CORS 都被使用,导致标头混淆。

我通过回归基础并找出我需要的软件包解决了这个问题,问题就消失了。

【讨论】:

您是在其他浏览器中还是仅在 Mozilla 中具有此功能?我的意思是如果包是问题,它在任何浏览器中都不起作用......我有 CORS 适用于 Chrome,但不适用于 Mozilla,并试图找出原因。【参考方案3】:

您需要在您的 Web API 项目中启用 CORS。 签出this!

【讨论】:

以上是关于跨域请求在 Firefox 中被阻止的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge 跨域请求被阻止错误

Firefox 跨域请求

Firefox 设置启用跨域 Ajax 请求

跨域请求被阻止 Symfony/AngularJS

socket.io 跨域请求被阻止

跨域请求被阻止原因:CORS 预检通道未成功