Safari 10.1:由于访问控制检查,无法加载带有查询参数的 XMLHttpRequest

Posted

技术标签:

【中文标题】Safari 10.1:由于访问控制检查,无法加载带有查询参数的 XMLHttpRequest【英文标题】:Safari 10.1: XMLHttpRequest with query parameters cannot load due to access control checks 【发布时间】:2017-09-16 22:53:23 【问题描述】:

当在包含查询参数(例如 https://example.com/api?v=1)的 URL 上尝试 Safari 10.1 上的 CORS request 时,Safari 会说

XMLHttpRequest 由于访问控制检查而无法加载

Chrome/Firefox 运行良好。

对于来自没有?v=1 的页面的请求,Safari 也可以正常工作。

我尝试从

更改服务器响应标头
Access-Control-Allow-Origin: https://example.com

Access-Control-Allow-Origin: https://example.com/api?v=1

但这会破坏 Chrome。

有什么建议吗?

【问题讨论】:

试试encodeURI('https://example.com/api?v=1') 已尝试,没有变化:对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”标头的值“test.com/page?v=1”不等于提供的原产地。因此不允许访问 Origin 'test.com'。 我在本地运行网站时遇到了与 Safari 相同的问题。 你们中的任何人找到解决方案了吗@Gaz 或 Marius? access-control-allow-origin 有点晕...能否请您清楚地指定您的 html 页面所在的 url、XHR 请求内容的 url 以及您添加访问权限的服务器-control-allow-origin to? 【参考方案1】:

您遇到了 CORS 问题。

一些可能的原因:

标头Access-Control-Allow-Origin 只能在服务器端设置,不能在客户端脚本中设置。 (您没有明确说明您这样做是正确的。) 你确定协议(http vs https vs 甚至file)完全一样吗? 如果您可能有多个子域,则需要使用 "^http(s)?://(.+\.)?test\.com$ 之类的内容设置配置(例如 Apache) .^ 标记了行的开头,以防止在此 URL 之前出现任何内容。您需要一个协议并在此处允许两者。子域是可选的。而$ 标志着行尾(您无需设置子页面,因为 origin 仅基于主机)。 如here 所述,将Access-Control-Allow-Headers: Origin 添加到服务器配置也可能是一种解决方案。尝试将我的 Safari 发出的实际请求与 Firefox 或 Chrome 发出的成功请求进行比较,以发现可能缺少的标头(也可以将它们与您的服务器配置进行比较)。

【讨论】:

【参考方案2】:

如果有人遇到这个错误,它只是发生在我正在构建的应用程序中。就我而言,它原来是 uri 中的尾随 /,导致 301 响应,出于某种原因,Safari 将其解释为 500 响应。

【讨论】:

【参考方案3】:

尝试以下可能会起作用 -

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

【讨论】:

你在哪里添加/更改它 需要在响应头中添加。【参考方案4】:

问题在于,有必要在 cors 的数据中更加具体,这在其他解释它的操作系统中不会发生

这个对我有用,因为它是 php 的一部分

header ("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header ("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header ("Allow: GET, POST, OPTIONS, PUT, DELETE");
$ method = $ _SERVER ['REQUEST_METHOD'];
if ($ method == "OPTIONS") 
     die ();

【讨论】:

【参考方案5】:

您的服务器需要回复 OPTIONS http 方法。不仅是 GET/POST/PUT/DELETE。 Safari 默默地请求这个隐藏在后台。您可以通过对连接的 MITM 攻击来发现这一点,例如Fiddler.

OPTIONS 请求至少需要响应跨域资源共享 (CORS) 标头,例如:

访问控制允许标头 访问控制允许方法 访问控制允许来源

另外:您的 Web 应用程序防火墙 (WAF) 或应用程序安全管理器 (ASM) 需要允许 OPTIONS 请求通过您的服务器。默认情况下,这通常会被阻止,因为它提供了一些有关 API 使用的攻击面变量(http 方法和标头)的信息。

【讨论】:

【参考方案6】:

您应该检查您调用的方法类型可能是 - PUT、POST、GET 等。

【讨论】:

以上是关于Safari 10.1:由于访问控制检查,无法加载带有查询参数的 XMLHttpRequest的主要内容,如果未能解决你的问题,请参考以下文章

由于访问控制检查,ios Safari XMLHttpRequest 无法加载

使用 Angular Material MD Stepper 时,由于访问控制检查,XMLHttpRequest 无法加载 XXXX

由于访问控制检查,XMLHttpRequest 无法加载 https://www.googleapis.com/drive/v3/files

图像无法在 iOS 上的 Safari 上加载

无法从iPhone Safari访问MacBook上的localhost,显示加载栏然后失败?

从动态加载的控制器中无法访问静态