我在DotCloud上使用Django,它在uwsgi + nginx之上使用Django。我试图将所有http流量重定向到https,这导致重定向循环。我使用以下http配置
if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }
Django似乎不明白它是在https上运行而且标头没有保留。它会将https://url.com/重定向到http://url.com/accounts/login/,它会再次重定向并再次导致重定向循环。我不是nginx的专家,也不太了解它。我能做错什么?
简而言之,如何在运行在uswsgi和nginx之上的django中将http重定向到https。
答案 0 :(得分:12)
我需要更多一点让Django意识到它应该使用https。
在settings.py中我添加了 SECURE_PROXY_SSL_HEADER =('HTTP_X_FORWARDED_PROTO','https')
在nginx配置中
location / {
proxy_set_header X-Forwarded-Proto https;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME https;
uwsgi_pass_header X_FORWARDED_PROTO;
uwsgi_pass unix:///path/to/socket;
}
答案 1 :(得分:6)
server {
listen 80;
server_name yourhttphost;
rewrite ^ https://yourhttpshost$request_uri? permanent; #301 redirect
}
server {
listen 443;
server_name yourhttpshost;
........
the rest
........
}
在nginx配置中使用“if”是一个非常糟糕的主意!
答案 2 :(得分:3)
if ( $scheme = "http" ) {
rewrite ^/(.*)$ https://$host/ permanent;
}