【问题标题】:Force SSL using ssl_requirement in Rails 2 app在 Rails 2 应用程序中使用 ssl_requirement 强制 SSL
【发布时间】:2010-10-05 07:51:45
【问题描述】:

我有一个需要在 SSL 下运行的 Rails 应用程序。我尝试了 ssl_requirement,但似乎我必须在每个控制器中输入所有操作。

有什么方法可以让我在应用控制器中添加一个带有 ssl_requirement 的 before_filter,以便当用户请求在 http 中时应用会自动重定向到 https?

谢谢大家。 :)

【问题讨论】:

  • 感谢您的提醒。标题已更改。 :)

标签: ruby-on-rails ssl ruby-on-rails-2


【解决方案1】:

使用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"

【讨论】:

  • lib/force_ssl.rb 默认情况下不会包含在 Rails 3.0.X 中。您需要将此行添加到您的application.rb:require File.expand_path('../../lib/force_ssl.rb', __FILE__) 或在其他地方执行某种类似的require。此外,config.middleware.use "ForceSSL" 行应该进入config/environments/production.rb
  • 正如 Simone Carletti 所指出的,在 rails >= 3.1 中有一个 force_ssl 方法可用。见simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl
  • 感谢小伙伴们的不断更新。 :)
【解决方案2】:

您可以尝试在应用程序的 before_filter 中测试请求是否在 ssl 中

class Application < AC::Base

  before_filter :need_ssl

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

【讨论】:

  • 也许你不在 Rails 3 中?
  • 应该是unless request.ssl?
【解决方案3】:

关键问题是 force_ssl.rb 没有被加载,并且 lib 在 rails 3.1 中默认没有加载。你必须添加

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

application.rb

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2014-03-28
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多