2010-10-05 20 views
20

J'ai une application Rails qui doit fonctionner sous SSL. J'ai essayé ssl_requirement mais il me semble que je dois taper toutes les actions dans chaque contrôleur.Force SSL utilisant ssl_requirement dans l'application Rails 2

Y at-il une méthode que je peux ajouter un before_filter dans le contrôleur d'application avec ssl_requirement, de sorte que les applications redirigera automatiquement vers https lorsque la requête de l'utilisateur est dans http?

Merci à tous. :)

+0

Merci pour le rappel. Titre changé. :) –

Répondre

32

Utilisez 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

ça marche bien. Merci mon pote. :) –

+2

'lib/force_ssl.rb' ne sera pas inclus par défaut dans Rails 3.0.X. Vous devrez ajouter cette ligne à votre 'application.rb':' require File.expand_path ('../../ lib/force_ssl.rb', __FILE __) 'ou faire une sorte de' require' similaire ailleurs. De même, la ligne 'config.middleware.use" ForceSSL "' devrait être placée dans 'config/environments/production.rb'. –

+6

Comme le souligne Simone Carletti, dans rails> = 3.1 il existe une méthode force_ssl disponible. Voir http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ –

4

Vous pouvez essayer test si la demande est en ssl ou non dans un before_filter dans votre application

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

oups ... j'ai eu une erreur. méthode non définie 'ssl? ' –

+1

Peut-être que vous n'êtes pas dans Rails 3? – shingara

+0

Je suis toujours dans les rails 2 ... donc c'est dans les rails 3, non? –

1

Le problème principal est que force_ssl.rb n'est pas chargé et que lib n'est pas chargé par défaut dans les rails 3.1. Vous devez ajouter

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

à application.rb