¿Redirigir ‘myapp.com’ a ‘www.myapp.com’ en los Rails sin usar htaccess?

Usar Appspace de Morph Labs para implementar un sitio no significa una forma automática de redirigir ‘myapp.com’ a ‘www.myapp.com’ (y no hay acceso a .htacess).

¿Hay una forma de hacer esto dentro de los Rails? ¿Necesitaría un plugin 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 incluir el subdominio ‘www’ en cada solicitud (porque el certificado SSL tiene específicamente un nombre común de ‘www.myapp.com’).

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 

La respuesta de Carson funciona muy bien.

Aquí está el código para ir al 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 funcionara 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 funciono muy bien para mi. 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 está respondido, 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 redirecciones específicas de env. http://coderack.org/users/tylerhunt/middlewares/6-canonical-host

Aquí hay un par de maneras 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 buscan forzar también SSL usando heroku, esto funcionó bien para mí, basado en Heroku SSL en el dominio raíz

En mi configuración de DNS, configuro un registro de URL / Reenvío (DNS simple)

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

La configuración de CNAME solo necesita ser configurada para WWW

 CNAME www.foo.com 3600 providedssslendpoint.herokussl.com 

También tuve que configurar y alias para mi root

 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 http://www.foo.com o test.foo.com) para poder tener el 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, vea 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 de 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 viejos enlaces sufrirán una pequeña caída, pero nada perceptible.