iOS11在所有移动浏览器中导致CORS问题

时间:2017-09-27 17:49:52

标签: ios safari cors ios11

我们在使用iOS11的iOS设备上测试我们的网站,并注意到它正在破坏,因为浏览器不接受来自我们API的响应。使用远程调试器,我们能够确定我们收到了CORS权限错误,并且正在剥离响应正文和HTTP标头。这似乎发生在所有移动iOS浏览器(Chrome / Safari)上,并且即使在我将CORS响应标头更改为通配符值后仍然会发生这种情况。但是,每个其他浏览器/操作系统/ iOS版本都能正常运行。我已经附加了来自api的网络响应,api的响应头以及我们从控制台获得的错误。

iOS11是否有可能造成这种情况,或者说失败了,有什么方法可以进一步诊断吗? enter image description here enter image description here enter image description here

5 个答案:

答案 0 :(得分:3)

我们遇到了类似的情况,即在域A上托管了一个表单,并将数据发布到域B上的API。 来自域A的POST请求包含与域B不相关的标头“ x-api-key”

对API的预检OPTIONS请求的响应包含标头

  • 访问控制允许来源:https://domainA
  • 访问控制允许标题:*
  • 访问控制允许方法:*

除了iOS上的浏览器外,其他所有浏览器都可以正常运行。 正如我们最终发现的那样,为Access-Control-Allow-Headers指定通配符* 不适用于iOS浏览器。在对OPTIONS请求的响应中,您需要指定POST请求中存在的所有标头,即使某些标头与域B上的服务器无关。 只有这样,iOS才会发送POST请求。

将响应标头更改为

  • 访问控制允许标题:接受,内容类型,X请求的方式,x-api-key

进行了此操作(即使服务器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”。