【问题标题】:Safari 10.1: XMLHttpRequest with query parameters cannot load due to access control checksSafari 10.1:由于访问控制检查,无法加载带有查询参数的 XMLHttpRequest
【发布时间】: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?

标签: javascript safari cors


【解决方案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 等。

          【讨论】:

            猜你喜欢
            • 2018-11-12
            • 2020-10-28
            • 1970-01-01
            • 2018-05-29
            • 1970-01-01
            • 2020-12-18
            • 1970-01-01
            • 2020-10-18
            • 2020-11-18
            相关资源
            最近更新 更多