使用 Apartment 禁用子域

disabling subdomains with Apartment

我在 rails 应用程序中使用公寓 gem。

我有一个数据库,每个租户都有模式,租户 table 有一个 public 模式。

我排除了 www 子域:

Apartment::Elevators::Subdomain.excluded_subdomains = ['www']

然后,如果我输入public.page.comwww.page.com,公寓不会切换到其他租户,而是会留在public。当然 "public" 本身不是租户,只是租户之间的公共数据,所以,我不希望任何用户使用 public 模式。

避免这种情况的正确方法是什么?

此应用程序在 AWS 上 运行,因此,路线 53 将阻止这种情况,但是,尽管我想避免 rails 通过此子域服务请求。

除了从公寓中排除域外,您还需要从路由中排除它们。 在我的项目中,我使用这段代码来管理这个:

我正在使用初始化程序创建已排除的子域数组。

# config/initializers/apartment/subdomain_exlusions.rb
Apartment::Elevators::Subdomain.excluded_subdomains = ['www', 'admin']

然后,我们可以在路由中的助手class中使用这个数组。

# config/routes.rb
class ExcludedSubdomainConstraint
  def self.matches?(request)
    request.subdomain.present? && !Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain)
  end
end

Rails.application.routes.draw do
  constraints ExcludedSubdomainConstraint do
    # here routes that are accessible in subdomains
  end
end

作为奖励,您可以将排除的子域路由到另一个约束


class DashboardSubdomainConstraint
  def self.matches?(request)
    Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain) || request.subdomain == ''
  end
end

constraints DashboardSubdomainConstraint do
  namespace :dashboard do
    get '/settings'
  end
end

会给你一条像 www.domain.com/dashboard/settinigs 这样的路线,可以访问 public 个租户。

提示。您可以在关注点

中使用不同的root方法