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.
- Agrega un CNAME
NAME.com
yNAME.com.herokudns.com
aNAME.com.herokudns.com
- Eso es. Esto es asumiendo que ya tiene un CNAME
www.NAME.com
vinculado awww.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.
- 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)
- configurar Heroku endpoint ssl como siempre https://devcenter.heroku.com/articles/ssl-endpoint
- Detrás en DNSimple, agregue un registro
ALIAS
apuntandofoo.com
a su punto final heroku ssl, algo así comowaterfall-9359.herokussl.com
- También agregue un registro CNAME apuntando
www.foo.com
a su punto final heroku ssl,waterfall-9359.herokussl.com
- 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.
DNSimple ofrece un tipo de registro ALIAS para abordar esta necesidad. Puede crear un alias desde su dominio raíz (aka apex de zona) apuntando a un CNAME. Lea más sobre esto aquí: