【发布时间】:2011-07-20 08:40:40
【问题描述】:
【问题讨论】:
-
不要挑剔或任何东西,但 konkurrance 拼写为 konkurrence。它似乎在页面上以两种方式拼写...
标签: ruby-on-rails ruby-on-rails-3 heroku
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 heroku
您最好的选择是使用您的 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。
【讨论】:
www. 请求重定向到裸域)也可以使用相同的方式。
我的解决方案:
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
【讨论】:
在SO article 中查看Justice 的回答 - 他的方法清晰、简单、有效且可定制。
【讨论】:
我建议在请求生命周期中更早地执行此操作。如果您要使用 Apache,您需要将 URL Rewrite 添加到 VirtualHosts 文件中。在 Heroku 上,您需要添加一些 Rack 中间件。
这里是an example,反之亦然(即www.example.org -> example.org)。我认为将其更改为您的用例不会有大问题。
这样请求就不会出现在您的日志中,也不需要 Rails 的所有请求解析。
【讨论】:
www. 的域设置为规范。 whatever-you-use.herokuapp.com 也会毫不费力地重定向到那里。
通常,您会在 HTTP 服务器级别使用 Apache 的 mod_rewrite 模块之类的东西来执行此操作,以便它在请求到达 Rails 堆栈之前发生。但是,Heroku 不允许您访问他们的 HTTP 服务器配置,因此需要一个替代方案。
我建议看一下Refraction,它是设计用来替代mod_rewrite 的机架中间件。它让您可以使用良好的可读 Ruby 代码编写重写规则,并且仍然比使用 Rails 本身完成任务要快。
【讨论】:
您也应该添加 www 域。
heroku domains:add www.vinderhimlen.dk
【讨论】:
假设您使用的是动作控制器,只需使用redirect_to:
redirect_to "http://www.vinderhimlen.dk"
【讨论】: