我有一个需要在 SSL 下运行的 Rails 应用程序。我尝试了 ssl_requirement 但似乎我必须在每个控制器中输入所有操作。
有没有什么方法可以在应用程序控制器中添加一个 before_filter 与 ssl_requirement,以便当用户请求在 http 中时应用程序将自动重定向到 https?
谢谢大家。:)
我有一个需要在 SSL 下运行的 Rails 应用程序。我尝试了 ssl_requirement 但似乎我必须在每个控制器中输入所有操作。
有没有什么方法可以在应用程序控制器中添加一个 before_filter 与 ssl_requirement,以便当用户请求在 http 中时应用程序将自动重定向到 https?
谢谢大家。:)
使用机架中间件。
# 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"
您可以尝试测试请求是否在 ssl 中或不在应用程序的 before_filter 中
class Application < AC::Base
before_filter :need_ssl
def need_ssl
redirect_to "https://#{request.host}/#{request.query_string}" unless request.ssl?
end
end
关键问题是 force_ssl.rb 没有被加载,并且 lib 在 rails 3.1 中默认没有加载。你必须添加
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
到application.rb