我们在使用iOS11的iOS设备上测试我们的网站,并注意到它正在破坏,因为浏览器不接受来自我们API的响应。使用远程调试器,我们能够确定我们收到了CORS权限错误,并且正在剥离响应正文和HTTP标头。这似乎发生在所有移动iOS浏览器(Chrome / Safari)上,并且即使在我将CORS响应标头更改为通配符值后仍然会发生这种情况。但是,每个其他浏览器/操作系统/ iOS版本都能正常运行。我已经附加了来自api的网络响应,api的响应头以及我们从控制台获得的错误。
答案 0 :(得分:3)
我们遇到了类似的情况,即在域A上托管了一个表单,并将数据发布到域B上的API。 来自域A的POST请求包含与域B不相关的标头“ x-api-key”
对API的预检OPTIONS请求的响应包含标头
除了iOS上的浏览器外,其他所有浏览器都可以正常运行。 正如我们最终发现的那样,为Access-Control-Allow-Headers指定通配符* 不适用于iOS浏览器。在对OPTIONS请求的响应中,您需要指定POST请求中存在的所有标头,即使某些标头与域B上的服务器无关。 只有这样,iOS才会发送POST请求。
将响应标头更改为
进行了此操作(即使服务器B上未处理标头x-api-key)
答案 1 :(得分:0)
我遇到了同样的问题。
在我的情况下,问题在于nginx不允许释放文件,因为主体太大,nginx不允许该请求传递给应用程序并只是终止了连接。我更改了client_body_max_size 10M
,它才起作用。查看您的nginx错误日志!
带我整天想一想。
答案 2 :(得分:0)
在我们的案例中,我们能够通过在从API发出OPTIONS预检请求时添加其他http标头信息来解决此问题。似乎Safari不喜欢CORS请求中的通配符条目,此外,还需要Access-Control-Allow-Header值中指定的每个标头,甚至是其他浏览器中不需要的“标准”标头。通过将以下标头添加到所有预检请求中,我们能够在站点和api之间重新获得X域请求。
<!-- 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 :(得分:-1)
iOS 11引入了一些新的跟踪保护功能,可以阻止某些网站/网址
您可以在设置 - &gt;中停用此功能。 Safari - &gt;防止跨站点跟踪。
也许那是你的问题?
我有同样的问题,这是有效的 - 但我想要一种方法,没有我们的用户必须这样做。
来源:https://www.macrumors.com/how-to/safari-ios-11-tracking-prevention/
答案 4 :(得分:-1)
对于react应用程序,我删除了默认提交表单,然后它也开始在IOS中运行。不确定内部。我使用OnClick作为按钮,而不是type =“ Submit”。