由于我们的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
在表达上我也有同样的事情。
有什么想法吗?!
答案 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”