首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单个应用程序上处理多个域的Rails路由

在单个应用程序上处理多个域的Rails路由
EN

Stack Overflow用户
提问于 2010-11-18 02:14:07
回答 2查看 39.9K关注 0票数 91

我一直无法找到一个可行的解决方案来解决这个问题,尽管在这里和其他地方有几个类似的问题。这个问题可能还没有在Rails3中得到回答,所以下面是这样的:

我有一个应用程序,目前允许用户创建自己的子域,其中包含他们的应用程序实例。在Rails2中,您最好使用subdomain-fu,而在版本3中,根据Railscast -- http://railscasts.com/episodes/221-subdomains-in-rails-3,它要简单得多。

这是很好的东西,但我也想为用户提供将自己的域名与他们的帐户相关联的选项。因此,虽然他们可能有http://userx.mydomain.com,但我希望他们也选择与http://userx.com相关联。

我发现在Rails2中有一些这样做的参考文献,但是这些技术似乎不再有效(特别是这一项:https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails-app/)。

有没有人能推荐一种使用路由来接受任意域并将其传递给控制器的方法,以便我可以显示适当的内容?

更新:多亏了莱昂尼德的及时响应和对代码的重新审视,我现在已经得到了大部分的答案。它最终需要添加到我正在使用的现有子域代码(来自Railscast解决方案),然后添加到routes.rb中。我还没有完全做到这一点,但我想发布我到目前为止所拥有的内容。

在lib/subdomain.rb中:

代码语言:javascript
复制
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中使用:

代码语言:javascript
复制
require 'subdomain'
constraints(Domain) do
  match '/' => 'blogs#show'
end

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

在这里,我在现有的子域代码(同样,它工作得很好)的前缀中添加了一个节来检查Domain。如果此服务器响应该域,并且它不是主站点运行所在的域,则转发到指定的控制器。

虽然这似乎是有效的,但我还没有完全解决所有的问题,但我认为这个特殊的问题已经解决了。

EN

回答 2

Stack Overflow用户

发布于 2011-01-19 23:20:19

根据http://guides.rubyonrails.org/routing.html#advanced-constraints的说法,在Rails3中实际上更简单

1)在lib/domain_constraint.rb中定义自定义约束类

代码语言:javascript
复制
class DomainConstraint
  def initialize(domain)
    @domains = [domain].flatten
  end

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

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

代码语言:javascript
复制
constraints DomainConstraint.new('mydomain.com') do
  root :to => 'mydomain#index'
end

root :to => 'main#index'

或者是老式的选项语法

代码语言:javascript
复制
root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')
票数 97
EN

Stack Overflow用户

发布于 2018-08-09 00:53:29

在Rails 5中,您可以简单地在路由中做到这一点:

代码语言:javascript
复制
constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4207657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档