Я только что обновился с 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.