如何修复iOS 12 Safari Cors印前检查错误?

How to fix iOS 12 Safari Cors preflight error?

提问人:dmo 提问时间:9/21/2018 最后编辑:dmo 更新时间:1/23/2022 访问量:9197

问:

我试图更好地理解 COR,因为我们的 Web 应用程序的几个用户抱怨说,自从他们升级到 iOS 12 以来,他们收到了预检错误。

Web 检查器中的错误

[Error] Preflight response is not successful
[Error] Fetch API cannot load https://www.api.com due to access control checks.
[Error] Failed to load resource: Preflight response is not successful (v4, line 0)

客户端应用是带有 Apollo 的 React 应用。它使用 Apache HTTPD 和 Express JS 通过 HTTPS 调用服务器。

在所有其他浏览器上一切正常,这与iOS 12隔离。

奇怪的是,当我查看 HTTPD 访问日志时,我看不到任何预检调用。当我尝试直接点击服务器(在 iOS 12 上)时,我在日志中看到预检 OPTIONS 请求和 POST。但是,当通过 Web 应用调用服务器时,COR 预检失败。

在 express 应用程序中,我还注销了所有请求,但它也没有出现在那里。

在HTTPD中,我有以下设置

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS

在表达中,我也有同样的事情。

有什么想法吗?!

IOS 快递 CORS 阿波罗 iOS12

评论

0赞 sideshowbarker 9/21/2018
发生故障时,浏览器在 devtools 控制台中报告的确切错误是什么?
0赞 dmo 9/21/2018
@sideshowbarker我把它添加到了问题中。干杯
0赞 sideshowbarker 9/21/2018
好的,那么您可能要做的下一件事是使用 Web 检查器检查请求和响应。打开“网络”选项卡并重新加载,单击“选项”请求。检查 Access-Control-Request-Method 和 Access-Control-Request-Headers 请求标头的确切值,然后检查响应以查看 HTTP 响应代码是什么,以及 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 响应标头的确切值,以及这些值与请求标头的比较情况。https://www.api.com
0赞 sideshowbarker 9/21/2018
在请求的前端代码中,是否设置了 Accept、Accept-Language 或 Content-Language 标头?
1赞 dmo 9/22/2018
这看起来更像是 iOS 的一个错误 - 我用它们创建了一个错误 bugreport.apple.com/web/?problemID=44621834

答:

13赞 S. Met 9/21/2018 #1

这是 iOSv12 中的一个错误,但它已经在 iOSv12.1 beta (16B5059d) 中修复,假设当前的 beta 代码已投入生产。

问题是 iOSv12 WebKit 预检 OPTIONS 调用不会离开设备。我已经运行 WireShark 和 iOSv12 模拟器来确认这一点。

评论

0赞 S. Met 9/22/2018
Ionic 社区首先在 iOS v12 beta 中发现了它,但根据这篇文章,v12 beta 2 解决了这个问题:stackoverflow.com/questions/50707146/......我不知道 beta 2 和 v12 之间发生了什么,我很惊讶另一个 stackoverflow 问题没有重新打开。
0赞 dmo 9/22/2018
如果情况相同,那就是一个巨大的倒退。仍然惊讶于更多的人咆哮着跑进去。
1赞 sideshowbarker 9/22/2018
感谢您在此处发布信息。似乎已解决的 WebKit 错误 bugs.webkit.org/show_bug.cgi?id=188355。修复的变更集是 trac.webkit.org/changeset/234626/webkit
0赞 David Dal Busco 9/23/2018
我没有重新打开 stackoverflow.com/questions/50707146/...因为我没有遇到iOS12最终版本的问题。我已经安装了 XCode 10 并使用模拟设备试用了我的应用程序,就像我在 6 月份所做的那样,但没有遇到问题
0赞 S. Met 10/31/2018
作为后续,iOS 12.1已经发布,我可以确认CORS正在按预期工作。您的问题@dmo也得到了解决?
-3赞 AKSHAT JAIN 12/17/2018 #2

如果您在 Ionic 中遇到错误,请删除此插件“cordova-plugin-ionic-webview”

评论

1赞 Andreas 12/17/2018
还请分享 OP 需要删除该特定插件的原因
0赞 opznhaarlems 4/21/2020
这就像说“你的车有发动机问题吗?只要拆下你的引擎......”
4赞 VeeRAdroit 1/21/2020 #3

如果显示“Access-Control-Allow-Headers”中不允许 Header,您可以通过从服务器端添加特定的 Header 来修复它,您可以在其中发送“Access-Control-Allow-Headers”。因为通配符不起作用 即“Access-Control-Allow-Headers”: “*”

它应该是 “access-control-allow-headers”: “*, Accept, Content-Type, Content-Length, Accept-Encoding, CUSTOM-ALLOWED-HEADER”

1赞 Wesley Coetzee 2/4/2021 #4

对于遇到此问题的任何人来说,问题是 iOS12 不喜欢您有任何自定义标题。这在BETA版中得到了修复,但似乎从未进入正式版本。<add name="Access-Control-Allow-Headers" value="*" />

解决方案是单独指定每个自定义标头,例如:<add name="Access-Control-Allow-Headers" value="*,customheader1,customheader2" />