我运行一个应用程序,该应用程序通过一个应用程序和服务器托管来自多个域的网站。我将其中一些域移至SSL,但其他域留在http。我正在运行Rails4.x。我相信我不能只使用

config.force_ssl = true

因为那样可以在所有域中实现它,而我并不需要。

我知道在ApplicationController中我可以做类似的事情
force_ssl if: :ssl_required?

def ssl_required?
  return [secure_domain1, domain2, domain3].include? request.domain
end

但是据我了解,这并没有实现HSTS或安全cookie。我的两个问题是:
  • 是否有比我上面更好的方法来实现它?
  • 如果我确实遵循上述路线,是否可以有条件地发送安全密码
    cooking 并仅针对那些领域实现HSTS?

  • 如果没有启用HSTS或安全cookie的简便方法,并且值得一试,那么我总是可以拆分我的应用程序并将其托管在两台不同的服务器上,其中一个实例包含所有https域,另一个实例仅包含http域。

    谢谢你的想法

    最佳答案

    使用Rails做到这一点实际上并不是一个坏主意,但正如评论所指出的那样,使用NGINX甚至会更好。如果您真的想使用Rails解决方案,则可以使用相同的def做类似的事情:

    force_ssl if: :ssl_required?
    
    def ssl_required?
      if [secure_domain1, domain2, domain3].include? request.domain
    
        #HSTS for Rails <=4
        response.headers['Strict-Transport-Security'] = 'max-age=315360000; includeSubdomains; preload'
        #HSTS for Rails >=5
        response.set_header('Strict-Transport-Security', 'max-age=315360000; includeSubdomains; preload')
    
        cookies[:secure] = true
        true
      else
        false
      end
    end
    

    您总是可以将HSTS header 调整为所需的max-age,或使用更惯用的方法放置#{365.days.to_i}而不是简单的字符串 header 。

    关于ruby-on-rails - 基于域在Rails中有条件地实现HSTS,SSL和安全Cookie,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49198793/

    10-11 06:25