2010-10-05 8 views
20

Mam aplikację Rails, która musi działać pod SSL. Próbowałem ssl_requirement, ale wydaje mi się, że muszę wpisać wszystkie akcje w każdym kontrolerze.Wymuś użycie SSL za pomocą ssl_requirement w aplikacji Rails 2

Czy jest jakaś metoda dodania filtru before_filter do kontrolera aplikacji z ssl_requirement, aby aplikacje automatycznie przekierowywały się do https, gdy żądanie użytkownika znajduje się w http?

Dzięki wszystkim. :)

+0

Dzięki za przypomnienie. Tytuł Zmieniono. :) –

Odpowiedz

32

Skorzystaj z 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

działa dobrze. dzięki stary. :) –

+2

'lib/force_ssl.rb' nie będzie domyślnie włączone w Railsach 3.0.X. Musisz dodać tę linię do 'application.rb':' require File.expand_path ('../../ lib/force_ssl.rb', __FILE __) 'lub zrobić coś podobnego' require' w innym miejscu. Ponadto linia 'config.middleware.use" ForceSSL "' powinna iść w 'config/environments/production.rb'. –

+6

Jak zauważyła Simone Carletti, w szynach> = 3.1 dostępna jest metoda force_ssl. Zobacz http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ –

4

Można spróbować testu jeżeli wniosek jest SSL lub nie w before_filter w aplikacji

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 ... Mam błąd. niezdefiniowana metoda 'ssl? ' –

+1

Może nie masz w Rails 3? – shingara

+0

Nadal jestem w szynach 2 ... więc to jest w szynach 3, prawda? –

1

Kluczowym problemem jest to, że force_ssl.rb nie jest załadowany i że lib nie jest ładowany domyślnie w szynach 3.1. Trzeba dodać

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

do application.rb

Powiązane problemy