Как правильно проксировать переменные $https и $scheme

Константин Осипов k.osipov.msk at gmail.com
Thu Aug 28 10:57:34 UTC 2014


Здравствуйте!
Я не нашёл полного ответа на свой вопрос, по этому я задам его здесь.

Суть проблемы с которой я столкнулся:
Есть балансер на основе nginx, который проксирует http и https соединения
на backend сервера (то же nginx).

Вне зависимости от того пришёл ли на балансер http или https запрос я
проксирую его на бэкэнд по http.

Всё работает, но на бэкэндах я не могу определить, какой запрос пришёл на
балансер http или https. Переменная $https всегда пустая, а $scheme всегда
имеет занчение "http".

Соответственно мне нужно как то проксировать переменные $https и $scheme.

Я делаю это так:
На балансере:
        location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                # тут проксируем переменную $scheme
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_connect_timeout 120;
                proxy_send_timeout    120;
                proxy_read_timeout    180;
        }

На бэкэнде:
В секцию http добавляю:
    map $http_x_forwarded_proto $https {
        default '';
        https on;
    }

    map $http_x_forwarded_proto $scheme {
        default http;
        https https;
    }

Но это не работает:
nginx: [emerg] the duplicate "https" variable in
/usr/local/etc/nginx/nginx.conf:39

Не работает видимо по тому что нельзя изменять переменные $https и $scheme.

Можно было бы сделать так:
    map $http_x_forwarded_proto $fastcgi_https {
        default '';
        https on;
    }

    map $http_x_forwarded_proto $fastcgi_scheme {
        default http;
        https https;
    }

Но я не хотел бы использовать не стандартные переменные потому что ниже в
секции location я использую переменные $https и $scheme в множестве правил
с rewrite. Не стандартные переменные создадут неудобства в случае если
конфигурация изменится.

Подскажите пожалуйста как правильно решить мою задачу?
Спасибо.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20140828/165af3a7/attachment.html>


Подробная информация о списке рассылки nginx-ru