3

我在 Amazon 上托管的网站拥有 ELB 级别的 SSL 认证。我使用以下站点设置了一个中间件以将所有http请求转发到https

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

它工作得很好。但这是我的问题。每个请求都被转发,所以我注意到点击链接等时有轻微的延迟。没什么特别的。但是有没有办法强制 django 做所有事情https呢?当我有代码到HttpResponseand时HttpResponseRedirect,我怎样才能让它默认为https而不是http?我试图搜索这个并没有成功......

我知道如果我https://www...为每个 URL 输入重定向和页面链接是可能的,但我想尽可能避免这样做。

4

3 回答 3

2

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

示例

于 2012-09-17T07:06:15.723 回答
2

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

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

您可以使用SECURE_PROXY_SSL_HEADER设置配置 Django 以检测这种确切的场景。

于 2016-11-08T02:23:44.860 回答
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;
  }
}
于 2013-02-06T19:10:09.030 回答