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').

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top