¿Redirigir 'myapp.com' a 'www.myapp.com' en rieles sin usar htaccess?
-
11-07-2019 - |
Pregunta
Usar el espacio de aplicaciones de Morph Labs para implementar un sitio no significa una forma automática de redirigir 'myapp.com' a 'www.myapp.com' (y no tener acceso a .htacess).
¿Hay alguna manera de hacer esto en los rieles? ¿Necesitaría un complemento como subdominio-fu ?
Más específicamente, estoy tratando de hacer algo como:
- 'myapp.com' = > 'www.myapp.com'
- 'myapp.com/session/new' = > 'www.myapp.com/session/new'
Básicamente, siempre quiero que el subdominio 'www' se anteponga a cada solicitud (porque el certificado SSL específicamente tiene un nombre común de 'www.myapp.com').
Solución
Tal vez algo como esto haría el truco:
class ApplicationController < ActionController::Base
before_filter :check_uri
def check_uri
redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
end
end
Otros consejos
La respuesta de Carson funciona muy bien.
Aquí está el código para ir hacia otro lado (www - > no www)
before_filter :check_uri
def check_uri
if /^www/.match(request.host)
redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri
end
end
Tuve que cambiar la respuesta de Carson para que esto funcione en Rails 3. Reemplacé request.uri con request.fullpath:
class ApplicationController < ActionController::Base
protect_from_forgery
Rails.env.production? do
before_filter :check_url
end
def check_url
redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
end
end
Esto funcionó muy bien para mí. Hice una pequeña adición ya que solo quería este comportamiento en mi entorno de producción:
def check_uri
redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end
Sé que esto se responde, pero pensé que todos los demás deberían saber acerca de la solución CodeRack: Canonical Host. Esto es realmente bueno ya que permite redireccionamientos específicos de env. http://coderack.org/users/tylerhunt/middlewares/6-canonical- host
Aquí hay un par de formas diferentes:
head :moved_permanently, :location => ‘http://www.newdomain.com’
otro:
def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end
Para aquellos de ustedes que también buscan forzar SSL usando heroku, esto funcionó bien para mí, basado en Heroku SSL en el dominio raíz
En mi configuración de DNS configuré un registro de URL / reenvío (DNS simple)
URL foo.com 3600 http://www.foo.com
La configuración de CNAME solo necesita configurarse para WWW
CNAME www.foo.com 3600 providedssslendpoint.herokussl.com
También tuve que configurar y Alias ??para mi raíz
ALIAS foo.com 3600 providedsslendpoint.herokussl.com
Entonces decidí simplemente reemplazar foo.com con una variable env ENV ['SITE_HOST']
(donde SITE_HOST podría ser igual a www.foo.com o test.foo .com) para poder tener control a través de mi configuración heroku. De esa manera, puedo controlar lo que sucede en diferentes entornos. (para configurar las variables env localmente, consulte https://github.com/bkeepers/dotenv )
Por ejemplo, mi aplicación de prueba usa test.foo.com como la URL, también tiene su propio punto final SSL, por lo que funciona bien para mí.
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
De ahora en adelante, los usuarios finales siempre tendrán acceso a www con SSL forzado. Los enlaces antiguos sufrirán una pequeña caída pero nada notable.