如何解决iOS 12 Safari Cors预检错误?

时间:2018-09-20 22:08:36

标签: ios express cors apollo ios12

由于我们的Web应用程序的多个用户抱怨,因为他们已升级到iOS 12,因此他们收到预检错误,因此我试图更好地理解COR。

网络检查器的错误

[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应用程序调用服务器时,CORs预检失败。

在快速应用中,我也注销了所有请求,但它也没有出现。

在HTTPD中,我的设置是

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

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

有什么想法吗?!

4 个答案:

答案 0 :(得分:6)

过去两天我一直在努力解决这个完全相同的问题,现在才找到解决方案/答案。

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

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

长时间潜伏,我注册了一个帐户只是为了发布此答案。如果我在回答这个问题时违反了规则/礼节,对不起。

答案 1 :(得分:1)

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

应该是 “访问控制允许标题”:“ *,接受,内容类型,内容长度,接受编码,自定义允许的标题”

答案 2 :(得分:0)

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

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

答案 3 :(得分:-2)

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