2010-06-19 145 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