Ruby on rails Heroku Rails强制SSL重定向循环

Ruby on rails Heroku Rails强制SSL重定向循环,ruby-on-rails,ruby,ssl,heroku,ruby-on-rails-4,Ruby On Rails,Ruby,Ssl,Heroku,Ruby On Rails 4,所以我有一个Rails应用程序,它在Heroku上有一个暂存环境和一个生产环境。我想在生产环境上强制使用ssl,但不想在登台上强制使用ssl。我的应用程序控制器(下面)显示了我是如何配置的,但是我的登台环境仍然试图强制ssl工作,这导致了重定向循环 我的问题是:A)如何停止重定向循环并使应用程序不因强制ssl而崩溃?以及B)我必须做些什么才能阻止强制ssl在我尚未完成的登台环境中发生 谢谢 class ApplicationController < ActionController::Ba

所以我有一个Rails应用程序,它在Heroku上有一个暂存环境和一个生产环境。我想在生产环境上强制使用ssl,但不想在登台上强制使用ssl。我的应用程序控制器(下面)显示了我是如何配置的,但是我的登台环境仍然试图强制ssl工作,这导致了重定向循环

我的问题是:A)如何停止重定向循环并使应用程序不因强制ssl而崩溃?以及B)我必须做些什么才能阻止强制ssl在我尚未完成的登台环境中发生

谢谢

class ApplicationController < ActionController::Base
  force_ssl if: :ssl_configured?
  before_action :configure_permitted_parameters, if: :devise_controller?

  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception


  # Make application helpers availble within controllers
  include ApplicationHelper

 # enable_authorization :unless => :devise_controller? # ACl

  before_filter do # ACL work around for attribute mass assignment
    resource = controller_path.singularize.gsub('/', '_').to_sym
    method = "#{resource}_params"
    params[resource] &&= send(method) if respond_to?(method, true)
  end

  rescue_from CanCan::Unauthorized do |exception|
    redirect_to main_app.root_path, :alert => exception.message
  end

  #handling redirection after login basing on the just logged in user role
  def after_sign_in_path_for(user)
    if user.has_role?(:director)
      unless user.organization.nil?
        dashboard_organization_path(user.organization.id) 
      else
        organization_trainings_url
      end
    elsif user.has_role?(:user)
      user_path(user)
    elsif user.has_role?(:admin)
      organization_trainings_url
    else
      root_url
    end
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << [:first_name, :last_name, :title, :phone, :email,
                                                 :organization_id, :badge, :dl,
                                                 :hire_date, :dl_expiration, :leader_id, :password, :current_password,
                                                 :division_id, :bureau_id]
  end 

  private 

  def ssl_configured?
    Rails.env.production?
  end

end
class ApplicationController:设计_控制器?#国际计算语言学协会
在使用过滤器之前,请先使用ACL解决属性质量分配问题
resource=controller_path.singularize.gsub(“/”,“"”)to_sym
method=“#{resource}_参数”
参数[resource]&&=send(method)if respond_to?(method,true)
结束
从CanCan营救|u::未经授权的do |异常|
将_重定向到主_app.root_路径:alert=>exception.message
结束
#根据刚刚登录的用户角色处理登录后的重定向
为(用户)在路径中签名后定义
如果user.has_角色?(:director)
除非user.organization.nil?
仪表板\组织\路径(user.organization.id)
其他的
组织机构\u培训\u网址
结束
elsif user.has_角色?(:user)
用户路径(用户)
elsif用户。是否具有_角色?(:admin)
组织机构\u培训\u网址
其他的
根地址
结束
结束
受保护的
def配置\u允许的\u参数

设计参数消毒剂。对于(:注册)您可以利用

例如,您可以使用

heroku config:set APP_NAME=my APP NAME

在每个Heroku服务器上,以便您可以在代码中区分它们。您可以按如下方式使用此环境/config变量:

# in production.rb
config.force_ssl = true unless ENV['APP_NAME'] == 'my-staging-app-name'
但是,IMHO,更好的方法是为您尝试执行的操作设置一个变量/标志,例如
SKIP\u FORCE\u SSL.

heroku config:set SKIP\u FORCE\u SSL=true

然后,在应用程序中,您可以检查是否应使用以下内容强制SSL:

config.force\u ssl=true,除非ENV['SKIP\u force\u ssl']

我建议使用如上所述的黑名单方法,因此默认情况下,如果应用程序找不到环境变量,或者您正在使用的任何其他方法来检查,则强制使用SSL

如果在生产模式下运行时需要在开发机器上进行测试(使用
production.rb
),可以在
~/.bash\u配置文件中设置相同的环境变量:

export SKIP\u FORCE\u SSL='true'

(请记住,您需要打开一个新的控制台选项卡/窗口才能使其生效。还要注意的是,环境变量将作为字符串返回,而不是布尔值返回,即使您不使用这些引号。)


希望这有帮助

您是否检查了
暂存
是否真的是
暂存
Rails.env.production?
在heroku控制台中返回什么?当我输入它时,得到的是false和
Rails.env.staging?
?您解决了这个问题吗?我也有同样的问题,这里也是。有什么见解吗?