【发布时间】: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