ruby-on-rails - enmascarar - redireccionar con htaccess
¿Redirige ''myapp.com'' a ''www.myapp.com'' en rieles sin usar htaccess? (7)
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).
¿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 subdominio ''www'' esté precedido en cada solicitud (porque el certificado SSL específicamente tiene un nombre común de ''www.myapp.com'').
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
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
La respuesta de Carson funciona de maravilla.
Aquí está el código para ir por el 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
Para aquellos de ustedes que buscan forzar SSL usando heroku, esto funcionó bien para mí, basado en SSL de Heroku en el dominio raíz
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 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 de env ENV[''SITE_HOST'']
(donde SITE_HOST podría 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 configurar variables de env localmente, consulte https://github.com/bkeepers/dotenv )
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í.
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.
Sé que esto se responde, pero pensé que todos los demás deberían saber sobre 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
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
Tuve que cambiar la respuesta de Carson para que 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