0

我有子域,例如:lks.harabiz.com& lkm.harabiz.com,每个子域都有自己的数据库表。

当有人尝试 URL:www.lkm.harabiz.com时,正在使用的数据库表与lkm's 不同,并且这些数据库表实际上属于www,而不是lkm

这个问题有两种解决方案:

  1. www.lkm.harabiz.com简单点lkm.harabiz.com
  2. www.lkm.harabiz.com使用实际属于的数据库表,lkm而不是www

我使用的是 Rails 5.0.0.1,该应用程序是通过 Heroku 部署的。

我查看了 DNS 的东西,以及应用程序级别的东西,但我无法达到预期的结果。

4

5 回答 5

2

您可以使用自定义电梯

# application.rb
module MyApplication
  class Application < Rails::Application
    config.middleware.use Apartment::Elevators::Generic, Proc.new { |request| request.host.split('.')[-3] }
  end
end
于 2017-06-18T14:30:54.217 回答
0

使用这些不同表的方式是特定于应用程序的,因此您不应添加任何 DNS 交互代码,因为它会使您的代码变得脆弱且不那么可移植,也不要修改 heroku 中的 DNS 选项或您的 DNS 条目。

您需要的是根据到达您的应用程序的 HTTP 请求的主机来使用所需的数据库。看看Rails.application.routeshttps://apidock.com/rails/ActionController/AbstractRequest/request_uri来做。阅读框架的请求路由。(或将您的路由代码放在这里以获得更多帮助)

于 2017-06-24T16:53:51.233 回答
0

更改公寓 gem 配置并将“www”添加到 exclude_domains 中config/initializers/apartment/subdomain_exclusions.rb

Apartment::Elevators::Subdomain.excluded_subdomains = ['www']
于 2019-12-17T15:30:12.277 回答
0

您可以使用下面的代码从您的 config/routes.rb 文件中捕获

Rails.application.routes.draw do
  get '', to: 'lkm_controllers#index', constraints: lambda { |r|
   r.subdomain.present? && r.subdomain == "www.lkm"
  }
  get '', to: 'lks_controllers#index', constraints: lambda { |r|
   r.subdomain.present? && r.subdomain == "www.lks"
  }
  # other resources
end

确保您在上面放置这两个命令,因此它首先检查它是使用 www.lkm 还是仅使用 lkm

于 2017-06-21T18:43:50.363 回答
0

只需将顶级域增加 1:

# config/environments/production.rb
Rails.application.configure do
  config.action_dispatch.tld_length = 2
end

有关此选项的更多信息,请参见:http: //guides.rubyonrails.org/configuring.html

还有一点关于它是如何工作的描述:http: //api.rubyonrails.org/classes/ActionDispatch/Http/URL.html

于 2017-06-19T11:17:35.733 回答