【问题标题】:How to conditionally force SSL depending on domain name?如何根据域名有条件地强制 SSL?
【发布时间】:2014-04-18 22:48:23
【问题描述】:

我的 Rails 应用程序有两个域名:app.example.com、short.net。较长的域是标准域,需要 HTTPS,较短的域是提供短 URL 的便利域,需要 HTTP。

目前我正在强制使用 SSL:

config.force_ssl = true

但我真的只想对更长的域名强制使用 SSL。如何根据域名有条件地强制 SSL?短域名会重定向到主域名,然后强制使用 SSL。这样可以避免短域名需要 SSL 证书。

想法?

【问题讨论】:

    标签: ruby-on-rails ssl https ruby-on-rails-4 routes


    【解决方案1】:

    给你的ApplicationController添加一些配置:

    class ApplicationController < ActionController::Base
       force_ssl if: :ssl_required?
    
       [...]
    
       private
       def ssl_required?
         request.host == 'app.example.com'
       end
    end
    

    来源:http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

    【讨论】:

    • 这是一个非常有趣的时机。我在下面发布了我的解决方案,并且非常接近您的建议。我试图在 routes.rb 文件中解决这个问题,但我认为我更喜欢这种方法。
    • 请注意,在控制器中设置force_ssl 不会实现与配置中config.force_ssl 相同的功能。除了强制重定向之外,基于配置的版本还为每个响应添加了 HSTS 和安全 cookie (source)
    • syntax error, unexpected ':' force_ssl if: :ssl_required?
    【解决方案2】:

    在 Rails 5 及更高版本中,您可以并且应该通过 ssh_options 执行此操作,因为 force_ssl 在 Rails 6.0 的控制器中已被弃用,并将在 6.1 中删除。

    config.force_ssl = true
    config.ssl_options = {
      redirect: {
        exclude: ->(request) { request.host == 'app.example.com' }
      }
    }
    

    【讨论】:

      【解决方案3】:
      class ApplicationController < ActionController::Base
        force_ssl if: :force_ssl?
      
      private
      
        def force_ssl?
          if Rails.env.production? || Rails.env.staging?
            return request.host != CONFIG[:short_host]
          end
          return false
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多