从一个Rails服务器提供多个TLD

时间:2014-01-30 22:18:31

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

我目前只有一台机器,运行包含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?

1 个答案:

答案 0 :(得分:0)

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

# 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

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