當使用SSL中間件將某些URL重定向到HTTPS時,我得到一個重定向循環。我該怎麼辦?如何防止使用gunicorn/nginx使用SSL的重定向循環?
我的nginx配置設置爲轉發請求gunicorn。
當使用SSL中間件將某些URL重定向到HTTPS時,我得到一個重定向循環。我該怎麼辦?如何防止使用gunicorn/nginx使用SSL的重定向循環?
我的nginx配置設置爲轉發請求gunicorn。
這裏有幾個步驟。
首先,修改方式中間件檢查SSL:
def _is_secure(self, request):
if request.is_secure():
return True
if 'HTTP_X_SSL_PROTOCOL' in request.META:
return True
return False
然後改變你的nginx的配置如下:
server {
listen 80;
listen 443 ssl;
...
location/{
...
proxy_set_header X-SSL-Protocol $ssl_protocol;
proxy_pass http://localhost:8000/;
}
}
proxy_set_header
只會轉嫁如果ssl_protocol
不爲空,即它是一個安全的連接。
重新啓動nginx,就完成了。
添加到湯姆的答案。如果您在Heroku或其他負載平衡器後面,以下內容可能也有幫助。
def _is_secure(self, request):
if request.is_secure():
return True
if 'HTTP_X_SSL_PROTOCOL' in request.META:
return True
# check the forwarded request's protocol
if request.META.get('HTTP_X_FORWARDED_PROTO')=='https':
return True
return False
由於django 1.4,你不需要定製的中間件,因爲它是內置的。另請參閱[SECURE_PROXY_SSL_HEADER](https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header)。順便說一句,nginx是個不錯的訣竅。 – bouke