2010-10-05 16 views
20

Possiedo un'applicazione Rails che deve essere eseguita in SSL. Ho provato ssl_requirement ma sembra che devo digitare tutte le azioni in ogni controller.Forza SSL utilizzando ssl_requirement nell'app Rails 2

C'è qualche metodo che posso aggiungere un before_filter nel controller dell'applicazione con ssl_requirement, in modo che le app reindirizzino automaticamente a https quando la richiesta utente è in http?

Grazie a tutti. :)

+0

Grazie per il promemoria. Titolo cambiato. :) –

risposta

32

Utilizzare un Rack Middleware.

# lib/force_ssl.rb 
class ForceSSL 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https' 
     @app.call(env) 
    else 
     req = Rack::Request.new(env) 
     [301, { "Location" => req.url.gsub(/^http:/, "https:") }, []] 
    end 
    end 
end 

# config/environment.rb 
config.middleware.use "ForceSSL" 
+0

funziona bene. grazie compagno. :) –

+2

'lib/force_ssl.rb' non sarà incluso di default in Rails 3.0.X. Dovrai aggiungere questa linea al tuo 'application.rb':' require File.expand_path ('../../ lib/force_ssl.rb', __FILE __) 'o esegui qualche sorta di' require' simile altrove. Inoltre, la riga '' ForceSSL "' config.middleware.use dovrebbe andare in 'config/environments/production.rb'. –

+6

Come sottolineato da Simone Carletti, in rails> = 3.1 è disponibile un metodo force_ssl. Vedi http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ –

4

Si può provare di prova se la richiesta è in SSL o meno in un before_filter nell'applicazione

class Application < AC::Base 

    before_filter :need_ssl 

    def need_ssl 
    redirect_to "https://#{request.host}/#{request.query_string}" unless request.ssl? 
    end 
end 
+0

oops ... ho ricevuto un errore. metodo non definito 'ssl? ' –

+1

Forse non sei in Rails 3? – shingara

+0

sono ancora in binari 2 ... quindi questo è in rails 3, giusto? –

1

Il problema principale è che force_ssl.rb non viene caricato e che lib non viene caricato di default in Rails 3.1. È necessario aggiungere

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

a application.rb

Problemi correlati