2009-10-05 6 views

Répondre

15

Vous pouvez explicitement les définir séparément et test pour l'environnement

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

Remarque, si vous êtes sur les anciennes versions de Rails, utilisez ENV [ 'RAILS_ENV'] == production au lieu

+1

En général, en utilisant Rails.env.production? est le chemin à parcourir. Il pourrait également être utilisé dans un before_filter qui redirige vers https, mais cela fonctionne tout aussi bien. –

+1

Merci. Pour une raison quelconque, le fait que les routes.rb est juste un vieux fichier Ruby régulier ne me frappe jamais. C'est bien. –

+1

Je ne fais que deviner ici, mais "Rails.env.development?" Ne serait-il pas "plus sûr"? Je voudrais que ma production soit la valeur par défaut, le développement l'exception. – Mosselman

0

Il est mieux de s'en tenir à ce que le protocole actuel est. Si votre environnement de production implique apache ou nginx pour les actifs statiques et ssl, assurez-vous que l'en-tête https X-FORWARDED_PROTO est envoyé au worker lorsque la requête client est sur le port https.

De cette façon, les utilisateurs seront traités de manière à ce que ssl soit géré de manière externe et qu'ils puissent générer des liens avec le protocole correct.

Je sais que ce serait mieux sur serverfault qu'ici, mais voici un exemple de fichier de configuration nginx qui force https et définit les en-têtes corrects pour la gestion des ssl chez les travailleurs licorne:

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

Ajouter une constante au sommet de votre fichier d'itinéraire comme:

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

Et puis le faire:

:protocol => ROUTES_PROTOCOL 

pour les routes nécessitant https

Questions connexes