2012-05-03 22 views
19

declaración servidor en mi nginx.conf:https redirect for rails app behind 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; 
      } 
    } 

declaración contra la corriente en nginx.conf:

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

esto funciona bien, miaplicacion es alcanzable como https://somehost

pero está generando la aplicación http url's para redireccionamientos, así que por ejemplo cuando se autentica con el dispositivo,/se redirige a http://somehost/user/sign_in en lugar de a https (desde el punto de vista de la aplicación Rails, de todas maneras es http).

me trataron

proxy_pass https://upstreamy; 

sino que simplemente trata de cifrar el tráfico entre nginx y los unicornios que se ejecutan la aplicación rieles.

También probé, en 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 

pero parece que no funciona.

¿Cómo se resolvería esto?

Editar: así que, el objetivo no es hacer que la aplicación de rieles requiera ssl, ni que se vea forzado a usar ssl; el objetivo es hacer que la aplicación Rails genere https: // url al redireccionar ... (creo que todas las demás URL son relativas).

Respuesta

42

es necesario agregar la siguiente línea:

reenviado-X-Proto proxy_set_header https;

como en

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

Gracias, que funciona perfectamente! –

+0

¡Impresionante! Configurar nginx puede ser muy doloroso. Muy doloroso ... :) –

+0

No pude usar proxy_set_header, pero acabo de reenviar todo a mi proxy para el método "publicar" y reescribir la url para el get. Trabajando muy bien hasta ahora. – nembleton

-2

Puede pasar :protocol => "https", a redirect_to.

Puede establecer esto como un defecto añadiendo lo siguiente a application.rb

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

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

+0

Esto no es transparente y combina el código de la aplicación con una configuración de implementación específica. – eprothro