2010-10-05 28 views
20

Tôi có ứng dụng Rails cần chạy dưới SSL. Tôi đã thử ssl_requirement nhưng dường như tôi phải gõ vào tất cả các hành động trong mọi bộ điều khiển.Force SSL sử dụng ssl_requirement trong ứng dụng Rails 2

Có phương pháp nào để tôi có thể thêm before_filter vào bộ điều khiển ứng dụng với ssl_requirement, để các ứng dụng sẽ tự động chuyển hướng đến https khi yêu cầu của người dùng nằm trong http?

Cảm ơn tất cả. :)

+0

Cảm ơn đã nhắc nhở. Tiêu đề đã thay đổi. :) –

Trả lời

32

Sử dụng một 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

hoạt động tốt. cảm ơn bạn đời. :) –

+2

'lib/force_ssl.rb' sẽ không được bao gồm theo mặc định trong Rails 3.0.X. Bạn sẽ cần phải thêm dòng này vào 'application.rb':' yêu cầu File.expand_path ('../../ lib/force_ssl.rb', __FILE __) 'hoặc thực hiện một số kiểu' require' tương tự ở nơi khác. Ngoài ra, dòng 'config.middleware.use" ForceSSL "' sẽ đi vào 'config/environment/production.rb'. –

+6

Như được chỉ ra bởi Simone Carletti, trong đường ray> = 3.1 có một phương pháp force_ssl có sẵn. Xem http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ –

4

Bạn có thể thử kiểm tra nếu yêu cầu là trong ssl hay không trong một before_filter trong ứng dụng của bạn

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 ... tôi gặp lỗi. phương thức không xác định 'ssl? ' –

+1

Có thể bạn không ở trong Rails 3? – shingara

+0

tôi vẫn còn trong đường ray 2 ... vì vậy đây là trong đường ray 3, phải không? –

1

Vấn đề chính là force_ssl.rb không được tải và lib đó không được tải theo mặc định trong đường ray 3.1. Bạn phải thêm

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

để application.rb

Các vấn đề liên quan