Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从一个Rails服务器服务多个TLD_Ruby On Rails_Ruby On Rails 3_Nginx_Passenger - Fatal编程技术网

Ruby on rails 从一个Rails服务器服务多个TLD

Ruby on rails 从一个Rails服务器服务多个TLD,ruby-on-rails,ruby-on-rails-3,nginx,passenger,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 ActionDi

我目前有一台机器,运行一个包含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中的子域处理已经完成(并且是错误的)。但是,相当危险的是,我将永久性地影响下一个请求的这个乘客实例。因此,它不仅在这个对.com.au的请求上被打破,而且可能在下一个对.com的请求上也被打破

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


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

看起来中间件是一种选择。这是最终对我有效的解决方案

# 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