Ruby on rails 从一个Rails服务器服务多个TLD
我目前有一台机器,运行一个包含nginx/Passenger/Rails 3.x的堆栈。这台机器有几个IP地址,每个TLD对应一个,主要用于SSL证书目的 我对较长的TLD(.co.uk、.com.au及其同类产品)有问题。我的第一次尝试是在我的ApplicationController中使用以下筛选器: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
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