【问题标题】:Serving multiple TLDs from one Rails server从一台 Rails 服务器提供多个 TLD
【发布时间】:2014-01-31 20:02:58
【问题描述】:

我目前有一台机器,运行一个包含 nginx/Passenger/Rails 3.x 的堆栈。这台机器有多个 IP 地址,一个用于我们服务的每个 TLD,主要用于 SSL 证书目的。

我遇到了较长 TLD(.co.uk、.com.au 等)的问题。我的第一次尝试是我的 ApplicationController 中的以下过滤器:

if request.host =~ /co\.uk$|com\.au$/
  ActionDispatch::Http::URL.tld_length = 2
else
  ActionDispatch::Http::URL.tld_length = 1
end

不幸的是,这在路由已经被解析之后运行,这意味着我在 config/routes.rb 中的子域处理已经完成(并且错误)。但是,相当危险的是,我会永久影响这个乘客实例的 NEXT 请求。因此,它不仅会破坏对 .com.au 的请求,而且可能还会破坏对 .com 的下一个请求。

我觉得我应该做的是在我的环境文件中设置tld_length,但我需要根据用户连接的接口的 IP 地址来设置(因为我有不同的每个 TLD 的 IP 地址)。

有没有简单的方法来做到这一点?如果没有,有没有更好的方法在同一台机器上处理多个 TLD?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 nginx passenger


    【解决方案1】:

    看起来中间件是要走的路。这是最终为我工作的解决方案。

    # config/application.rb
    
    config.middleware.use TldHandler
    

    还有:

    # app/lib/tld_handler.rb
    class TldHandler
      def initialize(app)
        @app = app
      end
    
      def call(env)
        TldHandler.enable_long_tlds(env['SERVER_NAME'])
        status, headers, response = @app.call(env)
      end
    
      def self.enable_long_tlds(hostname)
        if hostname =~ /co\.uk$|com\.au$/
          ActionDispatch::Http::URL.tld_length = 2
        else
          ActionDispatch::Http::URL.tld_length = 1
        end
      end
    end
    

    您可以根据需要继续扩展正则表达式。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2014-10-14
      • 2012-11-20
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多