来自iOS

时间:2017-06-30 10:20:08

标签: linux django apache2 ios

我在Django上有一个Web应用程序,它对服务器进行了大量异步调用。

除了Safari之外,它在所有浏览器中运行良好,特别是在用户报告至少间歇性问题的iOS上。

似乎问题可能源于Safari发送OPTIONS请求。这是Apache日志的一个片段(为匿名编辑):

  

172.31.34.143 - - [20 / Jun / 2017:14:12:46 +0100]" OPTIONS / asyncservice / HTTP / 1.1" 500 245" http://www.example.com/app/" " Mozilla / 5.0(iPhone;   CPU iPhone OS 10_3_2就像Mac OS X)AppleWebKit / 603.2.4(KHTML,就像   Gecko)Version / 10.0 Mobile / 14F89 Safari / 602.1"

有没有人经历过这个,有解决方案吗?

1 个答案:

答案 0 :(得分:0)

我可能已经解决了这个问题。

JavaScript设置了一个请求标头,用于发送Django CRSF(跨站点请求伪造)保护标头。

Safari看到此标题,不识别它并发送所谓的预检请求,即OPTIONS请求。

Apache拒绝这个请求的理由是Safari没有通过OPTIONS请求发送正确的来源(为什么它没有朦胧 - 它看起来像Safari中的一个错误,真的。)

Safari获得500并且结束POST请求是欺诈性的并且拒绝进行。

鉴于提出请求的原因是Safari没有识别Django CRSF标头,允许Apache从任何来源接收并信任Django用CRSF处理坏请求似乎是合理的。

所以,我已经将Apache配置为允许来自任何来源,例如:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

到目前为止,这些500年代都没有,但是它的早期。