Rails + Heroku + Cloudflare - 消除 www 作为子域

Rails + Heroku + Cloudflare - Eliminate www as a subdomain

我有一个多租户 Rails 4 应用程序,它使用带有 PostgreSQL 架构的子域来 'tenant' 应用程序。我在 Heroku 和 Cloudflare 中设置了子域通配符“*”并加载了站点,但它保持 "thinking" www 是一个有效的子域。因此,通常有效的链接(在开发中有效)在生产中不起作用,因为 www.mysite.com/accounts/new 等与 asdf.mysite.com/accounts/new 相同。有什么方法可以让我的应用几乎忽略 www 作为子域吗?我仍然希望 mysite.com 重定向到 www.mysite.com,但当它是 www?

时,几乎只是将子域设置为 false

为了使事情更具体一些,在我的 application_controller 中,我有一些代码执行以下操作。注意评论。在开发模式下,redirect_to root_url(subdomain: false) 有效,但在生产模式下,它只是无限重定向,不会加载。为了让它加载,我只是呈现页面,但这样做不会将子域设置为 false。

  def load_schema
    Apartment::Tenant.switch!('public')
    return unless request.subdomain.present?
    if current_account
      Apartment::Tenant.switch!(current_account.subdomain)
    else
      redirect_to root_url(subdomain: false) # Works locally, but infinite re-direct in production
      #render 'welcome/index' # - Renders the page in production, but nothing else works.
    end
  end

基本上,在开发模式下一切都按预期工作,但在生产模式下,似乎有一些 DNS 问题需要解决,但我似乎不知道该怎么做。有什么想法吗?

我的建议是强制 www.mysite.com 重定向到 mysite.com 您可能拥有主站点的地方。

您可以通过将主机名指向重定向服务或使用 routes.rb 文件中带有约束的特定路由来完成它。

我不得不删除 CloudFlare 中的 A 名称记录并将其替换为 CNAME 记录。我还添加了 2 个额外的 CNAME 记录:一个通配符和一个用于 www.