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

Конфигурация Nginx приводит к бесконечному циклу перенаправления

Итак, я просмотрел все образцы конфигурации, которые смог найти, но каждый раз, когда я пытаюсь просмотреть страницу, требующую ssl, я попадаю в цикл перенаправления. Я использую nginx / 0.8.53 и пассажирский 3.0.2.

Вот конфиг ssl

server  {
  listen 443 default ssl;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  rails_env production;  
  ssl_certificate      /home/app/ssl/<redacted>.com.pem;
  ssl_certificate_key  /home/app/ssl/<redacted>.key;

  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X_FORWARDED_PROTO https;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header  Host $http_host;
  proxy_set_header  X-Url-Scheme $scheme;
  proxy_redirect    off;
  proxy_max_temp_file_size 0;

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

Вот конфигурация без SSL

server  {
  listen 80;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  rails_env production;  

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

Сообщите мне, есть ли дополнительная информация, которую я могу предоставить для диагностики проблемы.

Похоже, ваше приложение не может обнаружить, что оно работает по https, и снова и снова перенаправляет на https URL.

Обычно https определяется на основе HTTPS переменная окружения, а пассажирский модуль для nginx позволяет установить ее с помощью пассажир_set_cgi_param директива. Добавление чего-то вроде

passenger_set_cgi_param  HTTPS  on;

в блок https server {} должно помочь.

Я думаю, что proxy_set_header директивы должны быть помещены в расположение разделы.

Попробуйте использовать:

...
location / {
    # needed for SSL
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Url-Scheme $scheme;
    proxy_max_temp_file_size 0;

    # Each of those lines may cause an infinate redirect loop
    #proxy_set_header X-FORWARDED_PROTO https;
    #proxy_set_header X-Forwarded-Proto $scheme;

    # This two may break the redirection when on ssl
    #proxy_set_header Host $http_host;
    #proxy_redirect off;
...

По крайней мере, это работает для меня в довольно сложной для настройки среде с haproxy перед nginx.

Надеюсь, это тебе поможет.