在AWS上使用django的ssl

时间:2012-09-17 06:01:58

标签: django ssl

我在亚马逊托管的网站上获得ELB级别的SSL认证。我使用以下网站设置中间件以将所有http请求转发到https

http://djangosnippets.org/snippets/2472/

它运作良好。但这是我的问题。每个请求都会转发,所以我发现点击链接等时会有轻微的延迟。没有什么极端的。但有没有办法迫使django通过https做所有事情?当我有HttpResponseHttpResponseRedirect的代码时,如何将其默认为https而不是http?我试图搜索这个并且没有成功......

我知道如果我为每个重定向网址和页面链接键入https://www...,我可能会尽可能避免这样做。

3 个答案:

答案 0 :(得分:2)

查看您发布的中间件,它正是您提到的您不想手动执行的操作,即将https附加到您域中的每个传入http请求中。我建议你将这个工作卸载到前端服务器(无论是nginx还是apache)。

示例

答案 1 :(得分:2)

当Django构建重定向的绝对URI时,它会检查request.is_secure以决定它应该使用的协议方案(http,https或ftp)。

Django默认根据用于请求的协议执行此操作,但正如您所确定的,当在LB或代理后面时,由于LB /代理级别的SSL终止,这可能是错误的。

您可以使用SECURE_PROXY_SSL_HEADER设置配置Django以检测此确切方案。

答案 2 :(得分:1)

我们目前使用Nginx来加载平衡,强制请求SSL,并在代理内部应用服务器时终止SSL连接。它没有那种花哨的负载平衡功能,但是Nginx体积小,速度快,可放在任何地方。

以下是您可能需要的代码位:

# listen on port 80 and redirect to SSL.
server {
   listen         80;
   server_name    site.com;
   rewrite        ^ https://$server_name$request_uri? permanent;
}

# listen on port 443, terminate SSL, and proxy to internal web app
# can be node, rails, whatever.
server {
  listen 443;
  server_name  site.com;
  gzip  on;
  client_max_body_size 250M;

  ssl   on;
  ssl_certificate   /etc/nginx/site.com.crt;
  ssl_certificate_key  /etc/nginx/site.com.key;
  keepalive_timeout  70;

  location / {
    proxy_pass http://127.0.0.1:8080;
    # We add this extra header just so proxied web app
    # knows this used to be an SSL connection.
    proxy_set_header x-https 1;
    include /etc/nginx/conf.d/proxy.conf;
  }
}