我一直在寻找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?
答案 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;