[Ruby-on-rails] 루트 도메인의 Heroku SSL


Answers

DNSimple 은 이러한 요구를 해결하기 위해 ALIAS 레코드 유형을 제공합니다. CNAME을 가리키는 루트 도메인 (영역 정점이라고도 함)에서 별칭을 만들 수 있습니다. 여기에서 자세히 알아보십시오.

http://blog.dnsimple.com/introducing-the-alias-record/

Question

내 heroku 앱에 SSL을 설정하려고합니다. 호스트 이름 기반 SSL 추가 기능을 사용하고 있습니다. heroku 문서 에는 다음 내용이 나와 있습니다.

Hostname based SSL will not work with root domains as it relies on CNAME 
aliasing of your custom domain names. CNAME aliasing of root domains is 
an RFC violation. 

예상대로 모든 것은 www 하위 도메인을 사용하여 사이트에 액세스 할 때 잘 작동합니다 (예 : https://www.foo.com) . 브라우저는 heroku.com에 대한 인증서로 https://foo.com에 액세스 할 때 불평합니다.

나는이 문제를 해결하기 위해 foo.com 의 트래픽을 www.foo.com 으로 리디렉션해야한다고 결론을 내렸다. 나는 다음과 같은 접근법을 고려 중이다.

1) DNS 기반 리디렉션

DNS 공급자 Zerigo 리디렉션 레코드를 지원 합니다. 나는 비슷한 주제에 관해서 우연히 만났습니다. 솔루션을 시도했지만 HTTP 리디렉션에만 사용됩니다 (Zerigo 설명서에서이를 확인합니다).

내 Zerigo 구성 :

foo.com      A             x.x.x.x
foo.com      redirect      http://www.foo.com
www.foo.com  CNAME         zzz.amazonaws.com

2) 랙 기반 리디렉션

리디렉션을 수행하기 위해 랙 기반의 미들웨어를 추가하십시오. 표준 호스트 (canonical-host) 젬은 그러한 지원을 제공합니다.

use CanonicalHost do
  case Rails.env.to_sym
    when :staging     then 'staging.foo.com'
    when :production  then 'www.foo.com'
  end
end

나는 더 나은 해결책이 있는지 궁금해하고있다. (월간 IP 기반 SSL을 100 달러로 바꿀 필요가 없다.)




한 가지 염두에 두어야 할 점은 두 버전 모두 액세스 할 수 있으면 Google에서 사이트의 두 버전을 색인화 할 수 있다는 것입니다 (루트 대 WWW). 유지 보수에 고통 스러울 수있는 것을 처리하기 위해 원추형을 설정해야합니다.

내 DNS 설정에서 URL / 전달 레코드 (DNS 단순)

URL foo.com     3600        http://www.foo.com

CNAME 설정은 WWW 용으로 설정해야합니다.

CNAME   www.foo.com 3600        providedsslendpoint.herokussl.com

나 또한 루트와 설치를해야했다.

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

그런 다음 간단히 foo.com 을 env ENV['SITE_HOST'] 변수 (여기서 SITE_HOST = www.foo.com 또는 내가 정의 할 수있는 곳)로 대체하기로 결정했습니다. heroku 구성 또는 .env 파일 ( https://github.com/bkeepers/dotenv 참조 )을 통해이를 제어 할 수 있습니다. 그렇게하면 다른 환경에서 일어나는 일을 제어 할 수 있습니다.

예를 들어, 내 테스트 애플 리케이션은 url처럼 test.foo.com 을 사용하기 때문에 자체 SSL 엔드 포인트를 가지고 있으므로 잘 작동합니다. 이것은 또한 스테이징 또는 qa 특정 환경을 만들기 위해 확장됩니다.

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

이제 최종 사용자는 강제 SSL을 사용하여 www에 항상 액세스합니다. 오래된 링크는 작은 걸림돌을 겪을 것이지만 눈에 띄는 것은 없습니다.




이전에 godaddy를 사용했던 heroku 사용자들에게는 godaddy에서 cloudflare로 DNS를 포팅했습니다. 그리고 https가 잘 작동하고 있습니다.

Godaddy DNS는 heroku와 호환되지 않습니다. 그리고 이것은 때문입니다 :

일부 DNS 제공 업체는 루트 도메인에 대해서만 A 레코드를 제공합니다. 안타깝게도 A 레코드는 정적 IP가 필요하기 때문에 루트 도메인을 Heroku로 지정하는 데 충분하지 않습니다. 이러한 레코드는 사내 구축 형 데이터 센터, 클라우드 인프라 서비스 및 Heroku와 같은 환경에서 사용할 때 심각한 가용성 영향을 미칩니다. Heroku는 동적 IP 주소를 사용하기 때문에 CNAME과 같은 레코드 (ALIAS 또는 ANAME 레코드라고도 함)를 사용해야 루트 도메인을 다른 도메인으로 지정할 수 있습니다.

설정은 매우 간단합니다.

먼저 godaddy dns manager에 cloudflare의 네임 서버를 추가하십시오. 다음은 몇 가지 예입니다.

roxy.ns.cloudflare.com sam.ns.cloudflare.com

다음 단계는 두 단계 만 더 필요합니다.

  1. CNAME NAME.com 추가하고 NAME.com 에 연결하십시오.
  2. 그게 전부 야. 이것은 www.NAME.com 에 CNAME www.NAME.com 이 이미 연결되어 있다고 가정합니다.

Rails를 사용하는 경우 config/environment/production.rb 에서 config.force_ssl = true 를 설정해야합니다.