Amazon ELB + Django HTTPS问题

时间:2018-05-13 23:29:35

标签: django django-rest-framework amazon-elb

我一直在寻找SO但是没有一个解决方案似乎适合我的情况:
我有来自AWS的Classic Elastic Load Balancer,将请求传递给我的Nginx docker容器,该容器也代理传递给我的python Gunicorn容器。

Nginx配置:

server {
    listen 80;
    listen [::]:80;
    ...

    if ($http_x_forwarded_proto = 'http') {
        return 301 https://$server_name$request_uri;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://app_server;
    }
 }

在我的Django设置中,我有:

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = False

问题是,当向端点发出请求时,如果我print(request.META.get('HTTP_X_FORWARDED_PROTO'))我得到http而不是https。这会导致我的DRF自动生成的文档链接在http而不是https中生成。

我的配置有问题吗?
如何在ELB后强制使用https?

2 个答案:

答案 0 :(得分:4)

添加

proxy_set_header X-Forwarded-Proto https; 
在你的nginx配置中

。由于ELB配置为接收https流量,因此您的nginx将始终使用https为客户端提供服务。

同样$scheme可能无效的原因是因为你的nginx仍然在http协议而不是https协议

答案 1 :(得分:0)

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;