2009-10-05 3 views

Antwort

15

Sie können sie explizit definieren getrennt und Test für die Umwelt

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

Hinweis, wenn Sie auf ältere Versionen von Rails sind, verwenden Sie ENV [ 'RAILS_ENV'] == Produktion statt

+1

Im Allgemeinen mit Rails.env.production? ist der Weg zu gehen. Es könnte auch in einem before_filter verwendet werden, das zu https umleitet, aber das funktioniert genauso gut. –

+1

Danke. Aus irgendeinem Grund trifft mich die Tatsache, dass routes.rb nur eine normale alte Ruby-Datei ist, nie. Das ist toll. –

+1

Ich rate nur hier, aber wäre 'Rails.env.development 'nicht' sicherer '? Ich möchte, dass meine Produktion der Standard ist, die Entwicklung die Ausnahme. – Mosselman

0

Es ist besser, um zu bleiben, was das aktuelle Protokoll ist.

Wenn Ihre Produktionsumgebung apache oder nginx für die statischen Assets und ssl umfasst, stellen Sie sicher, dass der HTPS-Header X-FORWARDED_PROTO an den Worker gesendet wird, wenn sich die Clientabfrage am HTTPS-Port befindet.

Auf diese Weise werden die Workerware sein, dass ssl aux extern behandelt wird und sie Verbindungen mit dem korrekten Protokoll erzeugen können.

Ich weiß, es würde auf serverfault besser sein als hier, aber hier ist ein Beispiel nginx-Konfigurationsdatei, die https zwingt und setzt die richtigen Header für ssl-Management in Einhorn Arbeiter:

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

eine Konstante hinzufügen nach oben Ihre Route Datei wie:

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

Und dann tut nur:

:protocol => ROUTES_PROTOCOL 

für die Routen, die https benötigen

Verwandte Themen