Установите переменную среды ОС HTTPS на
Вам необходимо включить переменную среды ОС HTTPS
на 'on'
, чтобы django добавлял https к полностью сгенерированным ссылкам (например, как с HttpRedirectRequest
s),Если вы используете mod_wsgi, вы можете добавить строку:
os.environ['HTTPS'] = "on"
в ваш wsgi скрипт .Вы можете убедиться в этом, прочитав django/http/__init__.py
:
def build_absolute_uri(self, location=None):
"""
Builds an absolute URI from the location and the variables available in
this request. If no location is specified, the absolute URI is built on
``request.get_full_path()``.
"""
if not location:
location = self.get_full_path()
if not absolute_http_url_re.match(location):
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
self.get_host(), self.path)
location = urljoin(current_uri, location)
return iri_to_uri(location)
def is_secure(self):
return os.environ.get("HTTPS") == "on"
Защитите свои куки
В settings.py поместите строки
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
и куки будут отправляться только через HTTPS-соединения.Кроме того, вы, вероятно, также хотите SESSION_EXPIRE_AT_BROWSER_CLOSE=True
.Обратите внимание, что если вы используете более старые версии django (менее 1.4), настройки для безопасных файлов cookie CSRF отсутствуют.В качестве быстрого исправления вы можете просто обеспечить безопасность файла cookie CSRF, когда файл cookie сеанса является безопасным (SESSION_COOKIE_SECURE=True
), путем редактирования django/middleware/csrf.py
:
class CsrfViewMiddleware(object):
...
def process_response(self, request, response):
...
response.set_cookie(settings.CSRF_COOKIE_NAME,
request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,
domain=settings.CSRF_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None)
Прямые HTTP-запросы к HTTPS на веб-сервере
Далее вам нужно правило перезаписи, которое перенаправляет запросы http на https, например, в nginx
server {
listen 80;
rewrite ^(.*) https://$host$1 permanent;
}
Функция reverse
Django и теги шаблонов URL возвращают только относительные ссылки;поэтому, если вы находитесь на странице https, ваши ссылки будут держать вас на сайте https.