A configuração do Nginx leva ao loop de redirecionamento sem fim

4

Então, olhei para todas as configurações de amostra que encontrei e, no entanto, toda vez que tento visualizar uma página que requer SSL, acabo em um loop de redirecionamento. Estou correndo nginx / 0.8.53 e passageiro 3.0.2.

Aqui está a configuração 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;
  }
}

Aqui está a configuração não 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;
  }
}

Deixe-me saber se há alguma informação adicional que eu possa dar para ajudar a diagnosticar o problema.

    
por brianthecoder 11.01.2011 / 03:05

2 respostas

2

Parece que seu aplicativo não consegue detectar que ele está sendo executado em https e redireciona para o URL https várias vezes.

Normalmente, o https é detectado com base na variável de ambiente HTTPS e o módulo de passageiro do nginx permite definir um com passenger_set_cgi_param directiva. Adicionando algo como

passenger_set_cgi_param  HTTPS  on;

no bloco https server {} deve ajudar.

    
por 26.09.2012 / 09:59
0

Acho que as diretivas proxy_set_header devem ser colocadas nas seções location .

Tente usar:

...
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;
...

Pelo menos isso funciona para mim em um ambiente bastante difícil de configuração com o haproxy na frente do nginx.

Espero que isso ajude você.

    
por 28.01.2011 / 12:49