2012-05-03 18 views
19

dichiarazione del server nel mio nginx.conf:https reindirizza per l'applicazione di rotaie dietro il proxy?

listen  1.2.3.4:443 ssl; 
    root /var/www/myapp/current/public; 
    ssl on; 
    ssl_certificate /etc/nginx-cert/server.crt; 
    ssl_certificate_key /etc/nginx-cert/server.key; 
    location/{ 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_redirect off; 

      if (!-f $request_filename) { 
      proxy_pass http://upstreamy; 
      break; 
      } 
    } 

dichiarazione a monte nginx.conf:

upstream upstreamy { 
    server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0; 
} 

questo funziona bene, MiaApp è raggiungibile come https://somehost

ma l'applicazione sta generando http url per i reindirizzamenti, quindi ad esempio quando si autentica con devise, il/viene reindirizzato a http://somehost/user/sign_in invece di https (dal punto di vista dell'app rails, è tutto http comunque).

ho cercato

proxy_pass https://upstreamy; 

ma che semplicemente cerca di cifrare il traffico tra nginx e gli unicorni che corrono l'applicazione rotaie.

Ho anche provato, in application_helper.rb:

# http://stackoverflow.com/questions/1662262/rails-redirect-with-https 
def url_options 
    super 
    @_url_options.dup.tap do |options| 
    options[:protocol] = Rails.env.production? ? "https://" : "http://" 
    options.freeze 
end 

ma sembra non funzionare.

Come si può risolvere questo?

Modifica: così, l'obiettivo non è rendere l'app per rails richiedere ssl, o essere obbligata a usare ssl; l'obiettivo è rendere l'app per i binari generare https: // url quando si reindirizza ... (penso che tutti gli altri URL siano relativi).

risposta

42

È necessario aggiungere la seguente riga:

proxy_set_header X-Forwarded-Proto https;

come in

location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Forwarded-Proto https; 
     proxy_redirect off; 

     if (!-f $request_filename) { 
     proxy_pass http://upstreamy; 
     break; 
     } 
} 
+1

Grazie, che funziona perfettamente! –

+0

Fantastico! Impostare nginx può essere molto doloroso. Molto doloroso ... :) –

+0

Non sono riuscito a utilizzare proxy_set_header ma ho appena inoltrato tutto al mio proxy per il metodo "post" e riscrivo l'url per ottenere. Funzionando molto bene finora. – nembleton

-2

È possibile passare :protocol => "https", a redirect_to.

È possibile impostare questo come un difetto aggiungendo quanto segue al application.rb

Rails.application.routes.default_url_options[:protocol]= 'https' 

Riferimento: https://stackoverflow.com/a/6101147/446203

+0

Non è trasparente e associa il codice dell'app a una specifica configurazione di distribuzione. – eprothro

Problemi correlati