我在亚马逊托管的网站上获得ELB级别的SSL认证。我使用以下网站设置中间件以将所有http
请求转发到https
:
http://djangosnippets.org/snippets/2472/
它运作良好。但这是我的问题。每个请求都会转发,所以我发现点击链接等时会有轻微的延迟。没有什么极端的。但有没有办法迫使django通过https
做所有事情?当我有HttpResponse
和HttpResponseRedirect
的代码时,如何将其默认为https
而不是http
?我试图搜索这个并且没有成功......
我知道如果我为每个重定向网址和页面链接键入https://www...
,我可能会尽可能避免这样做。
答案 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;
}
}