remove ruby-on-rails ssl heroku

ruby on rails - remove - Heroku SSL en el dominio raíz



heroku ssl certificate (6)

Estoy intentando configurar SSL para mi aplicación heroku. Estoy usando el complemento SSL basado en el nombre de host. La documentation heroku establece lo siguiente:

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.

Como era de esperar, todo funciona bien cuando accedo al sitio usando el subdominio www , es decir, https://www.foo.com . El navegador se queja cuando accedo a https://foo.com ya que el certificado presentado es para heroku.com.

Concluí que tengo que redireccionar el tráfico de foo.com a www.foo.com para abordar este problema. Estoy considerando seguir enfoques:

1) redirección basada en DNS

El proveedor de DNS Zerigo supports los registros de redirección . Encontré una question sobre un tema similar en SO. Probé la solución, funciona SOLO para la redirección HTTP (la documentación de Zerigo lo confirma).

Configuración de mi Zerigo:

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

2) Redirección basada en rack

Agregue un middleware basado en rack para realizar la redirección. La gema canonical-host proporciona tal apoyo.

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

Me pregunto si hay una mejor solución para esto (salvo el cambio a $ 100 por mes basado en IP SSL)


A los redireccionamientos DNS no les importaría si la solicitud entrante es http o https, por lo que mantendría el protocolo original, por lo que redirigiría http://foo.com a http://www.foo.com y lo mismo para https.

Tendrá que hacerlo dentro de la aplicación a través de la gema que encontró o de alguna otra gema de redirección de estante o si www. es un problema usar el complemento SSL basado en IP.


En la parte Rails, para hacer la redirección, sería más sensato hacer que ocurra en la capa del enrutador, así (funciona en Rails 3+):

Rails.application.routes.draw do match ''/*splat'' => redirect { |_, request| request.url.sub(''//www.'', ''//'') }, :constraints => { :subdomain => ''www'' } # ... end


Para aquellos usuarios heroku que usan godaddy anteriormente, simplemente termino de portar el DNS desde godaddy a cloudflare. Y el https está funcionando bien ahora.

Godaddy DNS es incompatible con heroku. Y esto se debe a:

Algunos proveedores de DNS solo ofrecerán registros A para dominios raíz. Desafortunadamente, los registros A no serán suficientes para señalar sus dominios raíz a Heroku porque requieren una dirección IP estática. Estos registros tienen serias implicaciones de disponibilidad cuando se usan en entornos tales como centros de datos en las instalaciones, servicios de infraestructura en la nube y plataformas como Heroku. Como Heroku usa direcciones IP dinámicas, es necesario usar un registro similar al CNAME (a menudo denominado registros ALIAS o ANAME) para que pueda apuntar su dominio raíz a otro dominio.

La configuración es bastante simple.

Primero, agregue los servidores de nombre de la nube flotante en el administrador de godaddy dns. Estos son algunos ejemplos:

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

Luego, solo necesitas dos pasos más.

  1. Agrega un CNAME NAME.com y NAME.com.herokudns.com a NAME.com.herokudns.com
  2. Eso es. Esto es asumiendo que ya tiene un CNAME www.NAME.com vinculado a www.NAME.com.herokudns.com

Si está utilizando Rails, asegúrese de configurar config.force_ssl = true en config/environment/production.rb


Una cosa que le gustaría tener en cuenta es que Google podría indexar ambas versiones de su sitio si ambas versiones son accesibles (Root vs WWW). Debería configurar los dispositivos cónicos para manejar lo que podría ser difícil de mantener.

En mi configuración de DNS configuro un registro URL / Reenviar (DNS simple)

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

La configuración CNAME solo necesita configuración para WWW

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

También tuve que configurar y Alias ​​para mi raíz

ALIAS foo.com 3600 providedsslendpoint.herokussl.com

Luego, decidí simplemente reemplazar foo.com con una variable env ENV[''SITE_HOST''] (Where SITE_HOST = www.foo.com o lo que sea que pueda definir). Puedo controlar esto a través de mi configuración de heroku o mi archivo .env (consulte https://github.com/bkeepers/dotenv ). De esa forma, puedo controlar lo que ocurre en diferentes entornos.

Por ejemplo, mi aplicación de prueba usa test.foo.com como URL, pero también tiene su propio punto final SSL, por lo que funciona bien para mí. Esto también se escala para crear escenarios o entornos específicos qa también.

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

A partir de ahora, los usuarios finales siempre accederán a www con SSL forzado. Los enlaces antiguos sufrirán un pequeño bloqueo pero nada notable.


Wow ... esto me llevó para siempre, y un montón de información en la web estaba mal. Incluso los documentos de Heroku no parecían indicar que esto fuera posible.

Pero la respuesta de Jesper J proporciona una pista en la dirección correcta: funciona con el registro ALIAS de DNSimple, que supongo que es un nuevo tipo de registro DNS que crearon. Tuve que cambiarles el servicio de DNS para obtener este tipo de registro (anteriormente estaba con EasyDNS).

Para aclarar cuándo digo "funciona" quiero decir:

  • todo el sitio en SSL usando su dominio raíz
  • sin advertencias del navegador
  • usando la oferta de Heroku''s Endpoint SSL ($ 20 / mes)

Funciona para todas las siguientes URL (las redirige a https://foo.com sin advertencias)

Para resumir los bits importantes.

  1. mueva su DNS a DNSimple (si alguien conoce a otros proveedores que ofrecen un registro de ALIAS, publíquelos en los comentarios, fueron los únicos que pude encontrar)
  2. configurar Heroku endpoint ssl como siempre https://devcenter.heroku.com/articles/ssl-endpoint
  3. Detrás en DNSimple, agregue un registro ALIAS apuntando foo.com a su punto final heroku ssl, algo así como waterfall-9359.herokussl.com
  4. También agregue un registro CNAME apuntando www.foo.com a su punto final heroku ssl, waterfall-9359.herokussl.com
  5. finalmente en su aplicación de rieles (o lo que sea) haga la siguiente configuración:

en production.rb set

config.force_ssl = true

en application_controller.rb add

before_filter :check_domain def check_domain if Rails.env.production? and request.host.downcase != ''foo.com'' redirect_to request.protocol + ''foo.com'' + request.fullpath, :status => 301 end end

¡Esto finalmente parece funcionar! La pieza clave parece ser el registro DNS de ALIAS . Me gustaría saber más sobre cómo funciona si alguien sabe y qué tan confiable / maduro es. Parece hacer el truco sin embargo.