仅在 iOS 移动 safari 中上传图像时出现错误的 CORS 失败

False CORS failure only in iOS mobile safari when uploading images

我 运行 在 iOS 11.3.1 和 iOS 模拟器中使用我的 iPhone 6 在移动版 Safari 上遇到一个奇怪的错误。

我有一个 Ionic 应用程序(PWA,不是 Cordova),几个月来一直运行良好,后端 API 使用 Laravel (PHP) 构建。我在上面配置了 CORS,它工作正常。

我刚刚尝试实现一项新功能,在该功能中我上传了一张图片,但它仅在移动版 Safari 上出现故障。

我看到 OPTIONS 请求通过了,看起来是正确的。事实上,request/response 看起来完全相同,除了来自桌面 Safari 的 User-Agent 有效。

在桌面版 Safari 上,此后跟一个 POST 成功。

在移动版 Safari 上,POST 甚至没有尝试退出,相反,尽管 OPTIONS 请求为 [= 返回 https://upload.geekity.com,但我收到一条消息 Failed to load resource: Origin https://upload.geekity.com is not allowed by Access-Control-Allow-Origin. 18=].

这是 OPTIONSPOST 在桌面和移动 safari 上的网络检查器的屏幕截图。

您可以在此处查看源代码:image-upload

我真的不知道这里会发生什么导致以这种方式失败。

尝试像 /api/ping 一样将端点添加到您的服务器。当您的应用程序启动时,首先向端点发送请求:

http.get('/api/ping');

没有身份验证,那么后续请求应该可以工作。

我还没有尝试过该解决方案,但可能会有帮助。

对于 laravel-5.4.* 在 .htaccess 文件中添加以下行

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers "X-API-KEY, Origin, X-Requested-With, Content-Type, Accept,Authorization"

使用本机 http 功能来避免这种情况 https://ionicframework.com/docs/native/http/ 它会完美地工作

你说得对,CORS 错误消息非常具有误导性。在过去的几天里,我一直在为完全相同的问题而苦苦挣扎,结果我试图从 phone 上传的图像对于我正在使用的应用程序服务器来说太大了,它是 Kubernetes 上的 nginx ;所以对我有用的修复方法是将此注释添加到入口配置

nginx.ingress.kubernetes.io/proxy-body-size: "0"

取消对上传大小的任何限制。