2008-11-29 12 views
27

El uso del espacio de aplicaciones de Morph Labs para implementar un sitio no implica una forma automática de redireccionar 'myapp.com' a 'www.myapp.com' (y no tiene acceso a .htacess).¿Redirige 'myapp.com' a 'www.myapp.com' en rieles sin usar htaccess?

¿Hay alguna manera de hacer esto? ¿Necesitaría un complemento como subdomain-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 'www' subdominio se anteponga en cada solicitud (porque el certificado SSL específicamente tiene un nombre común de 'www.myapp.com') .

Respuesta

30

Tal vez algo como esto sería hacer 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 
+0

¡Parece dulce, voy a probar esto en el próximo despliegue e informar los resultados! –

+0

Carson, esto funcionó para mí. ¡Muchas gracias por su respuesta! –

+0

Carson, me disculpo por no marcar su respuesta como la respuesta que acepté previamente. No me di cuenta de que todo lo que tenía que hacer era hacer clic en la marca de verificación. Nuevamente, mis disculpas. –

0

Aquí hay un par de maneras diferentes:

head :moved_permanently, :location => ‘http://www.newdomain.com’ 

otra:

def rails_301 
headers["Status"] = "301 Moved Permanently" 
redirect_to "http://www.newdomain.com" 
end 
+0

Acabo de editar mi pregunta original para dar más detalles sobre lo que estoy tratando de lograr. ¿Su respuesta todavía se aplica? –

+0

no estoy seguro, me temo que tendrías que intentarlo :) –

9

respuesta de Carson funciona muy bien.

Aquí está el código para ir a otro lado (www -> sin 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 
2

Esto funcionó muy bien para mí. Hice una pequeña adición, ya que sólo 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 
5

que tenía que cambiar la respuesta de Carson a conseguir que esto funcione en Rails 3. He sustituido con request.uri 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 
0

Para aquellos de ustedes que están buscando para forzar también el uso de SSL heroku , esto funcionó bien para mí, basado en Heroku SSL on root domain

en mi configuración DNS puedo tener un/registro Forward URL (simple DNS)

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

La configuración CNAME sólo tiene que ser configurado para WWW

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

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

ALIAS foo.com 3600  providedsslendpoint.herokussl.com 

Entonces decidió sustituir simplemente foo.com con una variable de entorno ENV['SITE_HOST'] (donde SITE_HOST puede ser igual a www.foo.com o test.foo.com) para que pueda tener control a través de mi configuración de heroku. De esa forma, puedo controlar lo que ocurre en diferentes entornos.(Para la creación de las variables env ver en la zona https://github.com/bkeepers/dotenv)

Por ejemplo, mi aplicación de prueba utiliza test.foo.com como la url que 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 

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.

Cuestiones relacionadas