使用CNAME重定向为www子域在Heroku上设置自定义域

时间:2010-06-19 06:31:35

标签: ruby-on-rails heroku dns cname

我正在使用Heroku,并为我的应用添加了几个自定义域名,即myapp.comwww.myapp.com

我在GoDaddy的DNS有三个A记录,'@'指向三个单独的Heroku IP,一个CNAME表示'www'子域,指向proxy.heroku.com

我想要做的是将所有流量重定向到www.myapp.commyapp.com。我尝试将CNAME设置为“@”,但仍然保留在同一个域中。有没有办法可以在DNS级别强制进行此重定向?

3 个答案:

答案 0 :(得分:8)

CNAME不是重定向,只是您域名的规范名称。这意味着它的行为就像它指向的域(在你的情况下是myapp.com)。您的浏览器获得与myapp.com相同的IP地址,并向其发送请求。

重定向在HTTP级别或更高级别执行。例如,您可以在应用中执行此操作,或者为此创建另一个简单应用。

以下是直接在您的应用中进行重定向的简单示例:

# in your ApplicationController
before_filter :strip_www

def strip_www
  if request.env["HTTP_HOST"] == "www.myapp.com"
    redirect_to "http://myapp.com/"
  end
end

或者你可以使用rails metal,它会做同样的事情,但要快得多:

# app/metal/hostname_redirector.rb
class HostnameRedirector
  def self.call(env)
    if env["HTTP_HOST"] == "www.myapp.com"
      [301, {"Location" => "http://myapp.com/"}, ["Found"]]
    else
      [404, {"Content-Type" => "text/html"}, ["Not Found"]]
    end
  end
end

您还可以使用正则表达式匹配主机名前面www.的所有请求。

答案 1 :(得分:1)

这是node.js的解决方案

$ heroku config:set APP_HOST=yourdomain.com

app.configure('production', function() {
    // keep this relative to other middleware, e.g. after auth but before
    // express.static()
    app.get('*', function(req, res, next) {
        if (req.headers.host != process.env.APP_HOST) {
            res.redirect('http://' + process.env.APP_HOST + req.url, 301)
        } else {
            next()
        }

    })
    app.use(express.static(path.join(application_root, 'static')))
})

这也会将domain.herokuapp.com重定向到yourdomain.com,阻止搜索引擎索引重复内容。

答案 2 :(得分:0)

您也可以在任何Rack应用中轻松完成此操作,方法是安装rack-canonical-host gem并将其放入Rack配置文件中:

require 'rack-canonical-host'
use Rack::CanonicalHost, 'myapp.com'