Not sure if @CraigKerstiens's answer takes into account that request.is_secure()
always returns False
if behind Heroku's reverse proxy and not "fixed". If I remember correctly, this will cause a HTTP redirect loop.
If you are running Django with gunicorn, another way to do it is to add the following to gunicorn's config
secure_scheme_headers = {
'X-FORWARDED-PROTO': 'https'
}
Run with some like this in your Procfile
web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -c config/gunicorn.conf
By setting gunicorn's secure-scheme-header
, request.is_secure()
will properly return True
on https requests. See Gunicorn Config.
Now @CraigKerstiens's middleware will work properly, including any calls to request.is_secure()
in your app.
Note: Django also has the same config setting call SECURE_PROXY_SSL_HEADER
, buts in the dev version.