2009-10-05 5 views

risposta

15

È possibile definire in modo esplicito separatamente e di prova per l'ambiente

if Rails.env.production? 
    map.resources :purchases, :requirements => {:protocol => "https"} 
    else 
    map.resources :purchases 
    end 

nota, se siete su versioni precedenti di Rails, utilizzare ENV [ 'RAILS_ENV'] == produzione invece

+1

In generale, utilizzando Rails.env.production? è la strada da percorrere. Potrebbe anche essere usato in un before_filter che reindirizza a https, ma funziona altrettanto bene. –

+1

Grazie. Per qualche ragione, il fatto che routes.rb sia solo un normale vecchio file di Ruby non mi colpisce mai. È grandioso –

+1

Sto solo indovinando qui, ma non "Rails.env.development?" Essere "più sicuro"? Vorrei che la mia produzione fosse il default, lo sviluppo l'eccezione. – Mosselman

0

E ' meglio attenersi a ciò che è il protocollo attuale.

Se l'ambiente di produzione include apache o nginx per le risorse statiche e ssl, assicurarsi che l'intestazione https X-FORWARDED_PROTO sia inviata al worker quando la query del client si trova sulla porta https.

In questo modo i lavoratori saranno ware che ssl viene gestito esternamente e possono generare collegamenti con il protocollo corretto.

so che sarebbe meglio su serverfault che qui, ma qui è un file di configurazione esempio nginx che costringe https e imposta le intestazioni corrette per la gestione della SSL in lavoratori unicorno:

upstream WEBAPP_NAME { 
     server unix:/path/to/webapp/tmp/sockets/unicorn.sock fail_timeout=0; 
    } 

server { 
    listen  4343; 
    server_name example.com; 

    root /path/to/webapp/public; 
    access_log /path/to/logs/nginx-access.log; 
    error_log /path/to/logs/nginx-error.log; 
    rewrite_log on; 

    ssl     on; 
    # redirect when http request is done on https port 
    error_page 497 https://example.com:4343$request_uri; 
    ssl_certificate  cert.pem; 
    ssl_certificate_key cert.key; 

    ssl_session_timeout 5m; 

    ssl_protocols SSLv2 SSLv3 TLSv1; 
    ssl_ciphers HIGH:!aNULL:!MD5; 
    ssl_prefer_server_ciphers on; 

location ~ ^/assets/ { 
     expires 1y; 
     add_header Cache-Control public; 

     add_header ETag ""; 
     break; 
    } 


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_pass http://WEBAPP_NAME; 
      proxy_redirect default; 
     } 
} 
1

aggiunge una costante verso l'alto del file di percorso come:

ROUTES_PROTOCOL = (Rails.env.production? ? "https" : "http") 

E poi basta fare:

:protocol => ROUTES_PROTOCOL 

per i percorsi che richiedono https

Problemi correlati