2010-06-19 7 views
7

저는 Heroku를 사용 중이며 내 앱에 몇 가지 맞춤 도메인을 추가했습니다 (예 : myapp.comwww.myapp.com).CNAME을 사용하여 Heroku에서 맞춤 도메인 설정 www 하위 도메인

내 GoDaddy의 DNS에는 세 개의 개별 Heroku IP를 가리키는 '@'에 대한 세 개의 A 레코드와 proxy.heroku.com을 가리키는 'www'하위 도메인에 대한 CNAME이 있습니다.

트래픽을 www.myapp.com에서 myapp.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 

당신은 할 수 Regex를 사용하여 모든 요청을 www.으로 호스트 이름 앞에 일치시킵니다.

1

그리고 여기에 검색 엔진을 색인 중복 콘텐츠를 방지 이것은 또한 yourdomain.com에 domain.herokuapp.com 리디렉션됩니다 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'))) 
}) 

를위한 솔루션입니다.

0
또한 어떤 랙 응용 프로그램에서의 rack-canonical-host 보석을 설치하고 랙 설정 파일이 넣어 아주 쉽게이 작업을 수행 할 수 있습니다

:

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

중대한 제안하지만,이 보석은에서 작동합니다 생각하지 않는다 앱이 client1.com, client2.com 등을 지원해야하는 멀티 테넌트 상황 ... 맞습니까? – cman77