【问题标题】:Tastypie POST Location HTTPS vs. HTTPTastypie POST 位置 HTTPS 与 HTTP
【发布时间】:2012-09-11 09:11:01
【问题描述】:

当我将一个新资源发布到我的 RESTful Tastypie API 时,我创建了一个资源并得到一个 201 响应,如下所示:

HTTP/1.1 201 CREATED
Content-Type: text/html; charset=utf-8
Date: Wed, 19 Sep 2012 01:02:48 GMT
Location: http://example.com/api/v1/resource/12/
Server: gunicorn/0.14.6
Content-Length: 0
Connection: keep-alive

太棒了!除了我发布到一个 HTTPS URL 并希望返回一个 HTTPS Location 标头。我如何配置 sweetpie 来做到这一点?

加法

我正在使用一些中间件来强制使用 SSL,但我认为这不是导致此问题的原因。反正就是这样:

class SSLifyMiddleware(object):
    # Derived from https://github.com/rdegges/django-sslify
    def process_request(self, request):
        if not any((not settings.FORCE_SSL, request.is_secure(), request.META.get('HTTP_X_FORWARDED_PROTO', '') == 'https')):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace('http://', 'https://')
            return HttpResponseRedirect(secure_url)

加法

这是一个 Heroku 应用程序。

【问题讨论】:

  • 您的request.is_secure() 结果有什么原因会是False? TastyPie 在返回这个请求时做了几件事,但是它在构建 URL 时只能基于request.build_absolute_uri(),所以在确定协议应该是http 还是https 时,它会归结为request.is_secure() 的结果。

标签: django http heroku https tastypie


【解决方案1】:

我们已经确定,以http而不是https开头的URL的原因是request.is_secure()False

有几个可能的原因导致request.is_secure() 成为False,例如在使用 HTTP 连接到服务器的负载平衡器或反向代理之后,而客户端和负载平衡器/反向代理之间的连接使用 SSL。

如果您使用代理或负载均衡器,请查看SECURE_PROXY_SSL_HEADER 的文档,这是一些解决方案:

但是,如果您的 Django 应用程序位于代理后面,则代理可能会“吞下”请求是 HTTPS 的事实,使用代理和 Django 之间的非 HTTPS 连接。在这种情况下,is_secure() 将始终返回 False——即使对于最终用户通过 HTTPS 发出的请求也是如此。

在这种情况下,您需要配置代理以设置自定义 HTTP 标头,告诉 Django 请求是否通过 HTTPS 传入,并且您需要设置 SECURE_PROXY_SSL_HEADER 以便 Django 知道要查找的标头。

【讨论】:

  • 谢谢——我会仔细看看这个,因为这个应用程序在 Heroku 上。这很可能是问题所在。
  • @Erik:如果这是 Heroku,请尝试使用我引用的设置并将 HTTP_X_FORWARDED_PROTO 添加到指示安全连接的标头列表中。有关更多详细信息,请查看:stackoverflow.com/a/9207726/548696。确实,Heroku 看起来有某种反向代理或负载均衡器,但我自己使用它的次数还不够多,无法确认。
  • 搞定了。您的链接帮助我发现我在 SSLify 中间件正在寻找的设置中遗漏了 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')。我现在唯一关心的是验证 Heroku 是否正在从传入的 http 请求中剥离标头。
  • 这也很有帮助:stackoverflow.com/questions/8436666/…。事实上,这就是我从中派生 SSLify 中间件的地方。
  • @Erik:我相信他们会这样做。如果他们不这样做,他们的安全就有漏洞(因为这是区分安全请求和不安全请求的唯一方法)。
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2014-03-04
  • 2011-01-02
  • 1970-01-01
  • 2011-03-09
  • 2015-04-07
  • 2011-11-01
相关资源
最近更新 更多