2012-05-03 22 views
19

deklaracja serwer w moim nginx.conf:Przekierowanie https dla aplikacji rails za 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; 
      } 
    } 

upstream deklaracja w nginx.conf:

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

to działa prawidłowo, MojaApl jest osiągalny jako https://somehost

ale aplikacja generuje http adresy URL dla przekierowań, więc na przykład podczas uwierzytelniania za pomocą urządzenia devise,/jest przekierowywany na http://somehost/user/sign_in zamiast na https (z punktu widzenia aplikacji szyny, to wszystko jest w ogóle http).

Próbowałem

proxy_pass https://upstreamy; 

ale właśnie próbuje szyfrowania ruchu między nginx i jednorożce uruchamianych aplikacji Rails.

Próbowałem też w 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 

ale wydaje się nie działać.

Jak można to rozwiązać?

Edycja: celem nie jest, aby aplikacja szyny wymagała ssl, lub aby była zmuszona do korzystania z ssl; celem jest sprawienie, by aplikacja railsowa generowała adresy URL https: // przy przekierowywaniu ... (Myślę, że wszystkie inne adresy URL są względne).

Odpowiedz

42

Trzeba dodać następujący wiersz:

proxy_set_header X-Przekazano-Proto https;

jak w

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

Dzięki, że działa idealnie! –

+0

Awesome! Konfiguracja nginx może być bardzo bolesna. Bardzo bolesne ... :) –

+0

Nie mogłem uzyskać dostępu do proxy_set_header, ale właśnie przekazałem wszystko do mojego proxy dla metody "post" i przepisanie adresu URL dla get. Jak na razie działa bardzo dobrze. – nembleton

-2

można przekazać :protocol => "https", aby redirect_to.

Można ustawić to jako domyślne poprzez dodanie następujących do environment.rb

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

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

+0

To nie jest przezroczyste i kodu aplikacji do określonej konfiguracji wdrożenia. – eprothro

Powiązane problemy