iOS11 在所有移动浏览器中导致 CORS 问题

Posted

技术标签:

【中文标题】iOS11 在所有移动浏览器中导致 CORS 问题【英文标题】:iOS11 causing CORS Issues in all mobile browsers 【发布时间】:2018-03-09 07:34:29 【问题描述】:

我们正在使用 ios11 的 iOS 设备上测试我们的网站,并注意到它出现问题,因为浏览器不接受来自我们 API 的响应。使用远程调试器,我们能够确定我们遇到了 CORS 权限错误,并且响应正文和 HTTP 标头被剥离。这似乎发生在所有移动 iOS 浏览器(Chrome/Safari)上,即使在我将 CORS 响应标头更改为通配符值之后,这种情况仍会继续发生。但是,iOS 的所有其他浏览器/操作系统/版本都运行良好。我已经附加了来自我们 API 的网络响应、我们 API 的响应标头以及我们从控制台获得的错误。

iOS11 是否存在可能导致此问题或失败的问题,有什么方法可以得到进一步的诊断吗?

【问题讨论】:

只是对此的更新——经过一些广泛的测试后,我发现这只是使用 https 时的问题——使用纯 http 可以正常工作(不是我会在我的网站上禁用 ssl/tls !)此外,即使没有自定义标头和预检请求,也会在 ios11 中出现此问题 我也有同样的问题。评论以关注更新。如果我们找到解决方案,将发表评论。 这方面有什么更新吗?我认为我们刚刚在 iOS 11 上的 Ionic 应用上也遇到了这个问题。 【参考方案1】:

我们在域 A 上托管一个表单并将数据发布到域 B 上的 API 时遇到了类似的情况。 来自域 A 的 POST 请求包含与域 B 无关的标头“x-api-key”

对 API 的预检 OPTIONS 请求的响应包含标头

访问控制允许来源:https://domainA 访问控制允许标头:* 访问控制允许方法:*

这对除 iOS 上的浏览​​器之外的所有浏览器都适用。 正如我们最终发现的那样,为 Access-Control-Allow-Headers 指定通配符 * 不适用于 iOS 浏览器。在对 OPTIONS 请求的响应中,您需要指定 POST 请求中存在的所有标头,即使某些标头与域 B 上的服务器无关。 只有这样,iOS 才会发送 POST 请求。

将响应标头更改为

Access-Control-Allow-Headers:Accept,Content-Type,X-Requested-With,x-api-key

做到了(即使标头 x-api-key 没有在服务器 B 上处理)

【讨论】:

为什么这在 iOS 中仍然是一个问题?我对此感到失望。感谢您成为这个问题的一个正确答案。 :P【参考方案2】:

在我们的案例中,我们能够通过在从我们的 API 发出 OPTIONS 预检请求时添加额外的 http 标头信息来解决问题。 Safari 似乎不喜欢 CORS 请求中的通配符条目,此外,它需要在 Access-Control-Allow-Header 值中指定的每个标头,甚至是其他浏览器中不需要的“标准”标头。通过将以下标头添加到所有预检请求中,我们能够让我们的站点和我们的 api 之间的 X-Domain 请求再次正常工作。

  <!-- headers for preflight CORS response-->
<add key="Access-Control-Allow-Origin" value="<exact name of site>" />
    <add key="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, DELETE" />
    <add key="Access-Control-Allow-Credentials" value="true" />
    <add key="Access-Control-Allow-Headers" value="Accept,Origin,Content-Type,X-LS-CORS-Template,X-LS-Auth-Token,X-LS-Auth-User-Token,Content-Type,X-LS-Sync-Result,X-LS-Sequence,token" />

【讨论】:

【参考方案3】:

iOS 11 引入了一些新的跟踪保护,可以阻止某些网站/URL

您可以在设置 -> Safari -> 防止跨站点跟踪中禁用此功能。

也许这是你的问题?

我有同样的问题,这可行 - 但我想要一种方法,让我们的用户不必这样做。

来源:https://www.macrumors.com/how-to/safari-ios-11-tracking-prevention/

【讨论】:

我目前正在开发一个小型视频流项目,该项目将 mp4 内容提供给所有现代浏览器。 iOS safari 的本机 HLS 视频播放器没有通过我的身份验证 cookie 及其请求,因为 src m3u8 播放列表是从不同的域提供的,即使我的 cookie 设置正确以允许这样做。更改此设置解决了我的问题。谢谢。【参考方案4】:

我遇到了同样的问题。

在我的情况下,问题是 nginx 没有让文件上传,因为 body 太大并且 nginx 没有让该请求传递给应用程序,只是终止了连接。我更改了client_body_max_size 10M,它就起作用了。查看您的 nginx 错误日志!

花了我一整天的时间才弄明白。

【讨论】:

以上是关于iOS11 在所有移动浏览器中导致 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

让 phpMyAdmin 进入项目并且不会在颠覆中导致错误

Phonegap 插件:BarcodeScanner 在 Eclipse 中导致错误

IOS 弹框在微信中导致输入框等失焦 偏移问题解决

spotipy auth 工作流在浏览器中导致 error=state_mismatch

它会在快速的类方法中导致内存泄漏吗

O2 中导致未定义符号的 gcc 优化标志