【问题标题】:Heroku how to redirect http:// to http://wwwHeroku 如何将 http:// 重定向到 http://www
【发布时间】:2011-07-20 08:40:40
【问题描述】:

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 heroku


【解决方案1】:

您最好的选择是使用您的 DNS 提供商设置重定向,因此它会在任何请求到达您的服务器之前很久就发生。来自Heroku Dev Center

子域重定向会导致对裸域的所有请求的 301 永久重定向到指定的子域,因此所有当前和未来的请求都会正确路由,并且完整的 www 主机名会显示在用户的位置字段中。

DNSimple 提供了一个方便的 URL 重定向,在这里可以看到重定向来自 heroku-sslendpoint.com 裸域到 www.heroku-sslendpoint.com 子域。

为了在 Heroku 上正确配置 www 子域应该是 CNAME 记录对 yourappname.herokuapp.com 的引用。

这样做的不仅仅是 DNSimple。我的 DNS 提供商是 123 Reg,他们支持它,但称它为 web forwarding

【讨论】:

  • 非常感谢您的评论 - 我碰巧在使用 DNSSimple,所以它对我来说就像一个魅力!
  • 可能值得注意的是,反过来(将所有www. 请求重定向到裸域)也可以使用相同的方式。
  • 您应该知道,有时,在处理 SSL 时,这种重定向是行不通的。具体来说,DNSimple 无法处理像 example.com => example.com 这样的重定向。见support.dnsimple.com/articles/url-redirect-ssl
【解决方案2】:

我的解决方案:

Terminal:

heroku addons:add custom_domains:basic
heroku domains:add www.vinderhimlen.dk
heroku domains:add vinderhimlen.dk

然后(http://devcenter.heroku.com/articles/custom-domains):

class ApplicationController
  before_filter :ensure_domain

  APP_DOMAIN = 'www.vinderhimlen.dk'

  def ensure_domain
    if request.env['HTTP_HOST'] != APP_DOMAIN
      # HTTP 301 is a "permanent" redirect
      redirect_to "http://#{APP_DOMAIN}", :status => 301
    end
  end
end

【讨论】:

  • 如果您还想在主机之后保留请求的内容:redirect_to "http://#{APP_DOMAIN}#{request.env['REQUEST_PATH']}", :status => 301
  • 最好使用机架中间件。例如blog.dynamic50.com/2011/02/22/…
  • 使用 DNS 会更好。
【解决方案3】:

SO article 中查看Justice 的回答 - 他的方法清晰、简单、有效且可定制。

【讨论】:

    【解决方案4】:

    我建议在请求生命周期中更早地执行此操作。如果您要使用 Apache,您需要将 URL Rewrite 添加到 VirtualHosts 文件中。在 Heroku 上,您需要添加一些 Rack 中间件。

    这里是an example,反之亦然(即www.example.org -> example.org)。我认为将其更改为您的用例不会有大问题。

    这样请求就不会出现在您的日志中,也不需要 Rails 的所有请求解析。

    【讨论】:

    • Heroku 不允许您访问 vhosts 文件。
    • @John:这就是为什么第 2-5 行解释了如何使用中间件在 Heroku 上做到这一点。
    • 我喜欢这个中间件:github.com/tylerhunt/rack-canonical-host 只需将包含www. 的域设置为规范。 whatever-you-use.herokuapp.com 也会毫不费力地重定向到那里。
    【解决方案5】:

    通常,您会在 HTTP 服务器级别使用 Apache 的 mod_rewrite 模块之类的东西来执行此操作,以便它在请求到达 Rails 堆栈之前发生。但是,Heroku 不允许您访问他们的 HTTP 服务器配置,因此需要一个替代方案。

    我建议看一下Refraction,它是设计用来替代mod_rewrite 的机架中间件。它让您可以使用良好的可读 Ruby 代码编写重写规则,并且仍然比使用 Rails 本身完成任务要快。

    【讨论】:

      【解决方案6】:

      您也应该添加 www 域。

      heroku domains:add www.vinderhimlen.dk

      【讨论】:

        【解决方案7】:

        假设您使用的是动作控制器,只需使用redirect_to

        redirect_to "http://www.vinderhimlen.dk"
        

        【讨论】:

        • 是的,在动作控制器上。看看我发布的链接。
        • 我已将 redirect_to "vinderhimlen.dk" 添加到我的应用程序控制器中,但仍然看到此消息 Heroku |没有这样的应用
        • 您需要将该无 www 的主机名添加到 Heroku。 devcenter.heroku.com/articles/custom-domains
        猜你喜欢
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2017-03-24
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多