ruby-on-rails Rails路由在单个应用程序上处理多个域

hts6caw3  于 2023-10-21  发布在  Ruby
关注(0)|答案(3)|浏览(116)

我一直无法找到一个可行的解决这个问题的办法,尽管有几个类似的问题在这里和其他地方。看起来这个问题在Rails 3中还没有得到回答,所以这里是:
我有一个应用程序,目前允许用户创建自己的子域,其中包含他们的应用程序示例。在Rails 2中,最好使用subdomain-fu gem,而在版本3中,它非常简单,就像Railscast --http://railscasts.com/episodes/221-subdomains-in-rails-3一样。
这是一个好东西,但我也想为用户提供选项,将他们自己的域名与他们的帐户相关联。因此,虽然他们可能有http://userx.mydomain.com,但我希望他们也选择关联http://userx.com
我在Rails 2中找到了一些这样做的参考资料,但这些技术似乎不再起作用了(特别是下面这一条:https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails-app/)。
有人能推荐一种方法来使用路由来接受任意域并将其沿着传递给控制器,以便我可以显示适当的内容吗?

更新:我现在已经得到了大部分的答案,感谢Leonid的及时回应,以及对代码的重新审视。它最终需要添加到我正在使用的现有子域代码中(来自Railscast解决方案),然后向routes. rb添加一点。我还没有到那里,但我想发布我到目前为止所拥有的。

在lib/subdomain.rb中:

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

class Domain
  def self.matches?(request)
    request.domain.present? && request.domain != "mydomain.com"
  end
end

我模仿第一类增加了第二类,这是已知的工作。我只是添加一个条件,确保传入的域不是我托管主站点的域。
这个类在routes.rb中使用:

require 'subdomain'
constraints(Domain) do
  match '/' => 'blogs#show'
end

constraints(Subdomain) do
  match '/' => 'blogs#show'
end

在这里,我在现有的子域代码(同样,它工作正常)前面加上一个节来检查域。如果此服务器响应该域,并且它不是主站点运行的域,则转发到指定的控制器。
虽然这似乎是工作,我还没有完全使整个事情工作,但我认为这个特殊的问题已经解决。

qco9c6ql

qco9c6ql1#

在Rails 3中实际上更简单,如http://guides.rubyonrails.org/routing.html#advanced-constraints所示:
1)在lib/domain_constraint.rb中定义一个自定义约束类:

class DomainConstraint
  def initialize(domain)
    @domains = [domain].flatten
  end

  def matches?(request)
    @domains.include? request.domain
  end
end

2)在路由中使用具有新块语法的类

constraints DomainConstraint.new('mydomain.com') do
  root :to => 'mydomain#index'
end

root :to => 'main#index'

或者老式的选项语法

root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')
kpbpu008

kpbpu0082#

在Rails 5中,你可以简单地在路由中这样做:

constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end
eaf3rand

eaf3rand3#

要扩展@user3033467答案,您不限于子域。
根据文档:

  • Rails基于请求的约束
  • 请求对象

对于我的具体情况,我需要“域”和“子域”的约束。
这对我来说很有效:

constraints host: %w[domain.com] do

end

对于子域名:

constraints subdomain: %w[subdomain www-subdomain] do

end

您甚至可以指定端口。

constraints subdomain: %w[subdomain www-subdomain], ports: 3000 do

end

为了将来的参考,这里是你可以传递的完整列表(点击查看完整大小):

相关问题