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

nginx не определяет схему $

Я только что обновился с nginx 1.4.1 до 1.8.0 (вместе с обновлением до Phusion Passenger 5.0.13). С этим изменением $scheme переменная из нашей конфигурации больше не установлена.

Конфигурация nginx выглядит примерно так:

server {
     listen 80;
     listen 443;
     ssl on;

     server_name app.example.com;

     passenger_enabled on;
     passenger_env_var HTTP_X_FORWARDED_PROTO $scheme;

     proxy_set_header X-Forwarded-Proto $scheme;

     ...
}

Когда я проверяю request.env['HTTP_X_FORWARDED_PROTO'] или request.headers['X-Forwarded-Proto'] в приложении Rails я получаю буквально «$ scheme», а не «http» или «https».

Я пробовал оба proxy_set_header и passenger_set_header и получить те же результаты.

Проблема здесь в том, что я устанавливал переменную среды, а также заголовок. Удаление этой строки исправило это:

passenger_env_var HTTP_X_FORWARDED_PROTO $scheme;

Это вызвано тем, что passenger_env_var оценивается в начало приложения а не по каждому запросу. Так как $scheme не определено в то время, он был установлен там.

Я не знаю, почему заголовок был задан заранее, но подозреваю, что это как-то связано с тем фактом, что Passenger пытается синхронизировать заголовки и переменные среды, чтобы имитировать среду CGI.