【问题标题】:How to map a full domain to a subdomain-based Rails app account?如何将完整域映射到基于子域的 Rails 应用程序帐户?
【发布时间】:2011-01-05 13:38:24
【问题描述】:

我正在开发一个 Rails 应用程序,该应用程序默认将用户帐户设置到他们选择的子域。作为一种选择,他们将能够将自己的完整域映射到他们的帐户。

到目前为止,这就是我的设置方式。我正在使用subdomain-fu 为路由供电:

# routes.rb
map.with_options :conditions => {:subdomain => true} do |app|
  app.resources # User's application routes are all mapped here
end

map.with_options :conditions => {:subdomain => false} do |www|
  www.resources # Public-facing sales website routes are mapped here
end

除此之外,我还使用method described here 来获取正在通过子域或完整域访问的帐户:

before_filter :set_current_account

def set_current_account
  if request.host.ends_with? current_domain
    # via subdomain
    @current_club = Club.find_by_subdomain(current_subdomain)
  else
    # via full domain
    @current_club = Club.find_by_mapped_domain(request.host)
  end
end

我还没有在构建这个过程中走得很远,但我已经看到我将遇到路由问题。如果 request.host 是一些 random.com 域,那么 subdomain-fu 不会路由适当的路由?

我假设这不是一个不寻常的问题,所以任何人都可以分享他们是如何解决这个问题的,或者我将如何配置我的路线来做我需要的事情?

【问题讨论】:

    标签: ruby-on-rails ruby routing subdomain


    【解决方案1】:

    您可以编写一个 Rack 中间件,在域到达 Rails 应用程序之前将其转换为子域。

    class AccountDetector
      def initialize(app)
        @app = app
      end
    
      def call(env)
        account = Club.find_by_mapped_domain(env["HTTP_HOST"])
        if account
          env["HTTP_HOST"] = "#{account.subdomain}.yourdomain.com"
        end
    
        @app.call(env)
      end
    end
    

    然后将其添加到environment.rb:

    config.middleware.use AccountDetector
    

    【讨论】:

    • 谢谢。我喜欢这个答案,所以做了一些测试。您的中间件脚本运行良好,但不幸的是,它对会话产生了一些奇怪的连锁反应(使用 Authlogic)。我决定 - 不情愿地 - 将应用程序拆分为两个单独的应用程序。
    【解决方案2】:

    我遇到了这个问题,试图在一个应用程序中做太多事情。你会开始在非常奇怪的地方做你不应该做的条件。我决定有 2 个独立的 Rails 应用程序,它们的通配符域指向用户的应用程序,然后让 www.domain.comdomain.com 指向面向公众的一侧。我知道这并不能直接“回答”你的问题。

    如果您将其添加到该方法的顶部,我可以帮助您修复那里的小代码气味:

    return @current_club if defined?(@current_club)
    

    它不会在你每次尝试访问@current_club时进行查询,它会返回你已经返回的结果。

    【讨论】:

    • 感谢您的回答。在尝试了此处发布的其他解决方案后,我得出的结论是,您是对的,为了简单起见,最好的办法是将其拆分为两个应用程序并取消 subdomain-fu。
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多