Я настраиваю сервер Nginx так, чтобы он служил обратным прокси для обслуживания приложения Django (запускается на Gunicorn).
Моя проблема в том, что я хочу, чтобы мой сайт был защищен с помощью HTTPS, и поэтому я хочу, чтобы мое приложение Django могло определять, является ли соединение безопасным или нет. Я использую Django 1.4, поэтому у меня есть доступ к SECURE_PROXY_SSL_HEADER
, который я настроил как SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
.
Теперь, как указано в документации, мне нужно убедиться, что Nginx добавляет заголовок только тогда, когда это необходимо, и удаляет его, когда нет. Поскольку я хотел бы, чтобы моя конфигурация Nginx была максимально СУХОЙ, я бы предпочел не иметь двух файлов конфигурации (один для порта 80 и один для порта 443).
Поэтому я хотел бы знать, есть ли в Nginx способ определить, является ли соединение https, и соответственно добавить (или удалить) заголовок.
Это решение делает не опишите, как удалить заголовок только по HTTP, как указано в заголовке вопроса.
Безопасное решение вашей проблемы - добавить
proxy_set_header X-Forwarded-Protocol $scheme;
Он установит X-Forwarded-Protocol
к http
по HTTP-запросам и к https
по запросам HTTPS.
Это гарантирует, что этот заголовок будет переопределен, если клиент установил его, как того требует https://docs.djangoproject.com/en/1.4/ref/settings/#secure-proxy-ssl-header.
НОТА: Если вы делитесь своим проектом Django, обязательно предупредите пользователей об этом, если вы включаете SECURE_PROXY_SSL_HEADER
в settings.py
, и лучше всего закомментировать его по умолчанию.