【问题标题】:OPTIONS requests from iOS来自 iOS 的 OPTIONS 请求
【发布时间】:2017-06-30 10:20:08
【问题描述】:

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

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

看来问题可能源于 Safari 发送 OPTIONS 请求。这是来自 Apache 日志的 sn-p(为匿名而编辑):

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) 版本/10.0 移动版/14F89 Safari/602.1"

有没有人遇到过这种情况,有解决办法吗?

【问题讨论】:

    标签: linux django apache2 ios


    【解决方案1】:

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

    有一个由发送 Django CRSF (Cross Site Request Forgery) 保护头的 JavaScript 设置的请求头。

    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 年代还没有出现,而是早期。

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2014-12-27
      • 2017-03-22
      • 2015-10-03
      • 2015-03-01
      相关资源
      最近更新 更多