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