我目前只有一台机器,运行包含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?
答案 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
您可以根据需要继续扩展正则表达式。