8

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

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

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

4

3 回答 3

9

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.主机名前面的所有请求。

于 2010-06-19T11:16:31.337 回答
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,防止搜索引擎索引重复的内容。

于 2012-02-28T20:17:48.527 回答
0

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

require 'rack-canonical-host'
use Rack::CanonicalHost, 'myapp.com'
于 2012-02-28T20:21:26.120 回答