Eri*_*rik 6 django https http heroku tastypie
当我将新资源发布到我的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
Run Code Online (Sandbox Code Playgroud)
大!除了我发布到HTTPS URL并希望获得HTTPS Location标头.如何配置tastypie来执行此操作?
加成
我正在使用一些中间件来强制使用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)
Run Code Online (Sandbox Code Playgroud)
加成
这是一个Heroku应用程序.
正如我们已经决定,开始与URL的原因http,而不是https被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知道要查找的标头.
| 归档时间: |
|
| 查看次数: |
1077 次 |
| 最近记录: |