Назад | Перейти на главную страницу

Nginx: убрать заголовок по HTTP, добавить заголовок по HTTPS

Я настраиваю сервер 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, и лучше всего закомментировать его по умолчанию.