2010-06-19 147 views
7

我使用Heroku,并为我的应用添加了几个自定义域,即myapp.comwww.myapp.com在Heroku上为www子域名设置自定义域名CNAME重定向

我在GoDaddy的DNS有三个'@'记录,指向三个独立的Heroku IP,以及一个指向proxy.heroku.com的'www'子域的CNAME。

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

回答

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 

或者你可以使用导轨金属,它会做同样的,但要快得多:

# 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

下面是用于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,防止搜索引擎索引重复内容的解决方案。

0

你也可以做到这一点很容易地在任何机架应用程序,通过安装rack-canonical-host宝石,并把这个在您的机架配置文件:

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

伟大的建议,但千万不要以为这种宝石将在一个工作多租户的情况下,你的应用需要支持client1.com,client2.com等......对吗? – cman77 2012-09-07 15:10:12