2010-12-07 11 views
5

he alojado en mi aplicación Heroku, y tienen un certificado para www.mysite.comcarriles - www Asegurar está en la URL

que estoy tratando de resolver

  • Asegurar www está en la URL, y que la URL es HTTPS

esto es lo que tengo hasta ahora:

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) if Rails.env == 'production' 
    end 

Pero esto no parece estar funcionando. Cualquier sugerencia o tal vez diferentes enfoques para resolver para garantizar HTTPs y www. está en la URL?

Gracias

+0

Hola a todos, publiqué un bounty de +500, creo que Justice se dirige en el camino correcto con la sugerencia a continuación, pero no he podido hacer que funcione. Tal vez un par de ojos frescos pueden ayudar a resolver esto para siempre. Gracias – AnApprentice

+0

¿Puedes aclarar cómo no funciona? ¿No está pasando nada? ¿Recibes redirecciones cuando no deberías? Además, ¿desea que todo el acceso a su aplicación se realice a través de https o solo para direcciones URL específicas? Parece que quieres lo primero, pero solo asegúrate de ... –

Respuesta

12

Para el SSL, utilizan rack-ssl.

# config/environments/production.rb 
MyApp::Application.configure do 
    require 'rack/ssl' 
    config.middleware.use Rack::SSL 
    # the rest of the production config.... 
end 

Para la WWW, crear un Rack middleware de su cuenta.

# lib/rack/www.rb 
class Rack::Www 
    def initialize(app) 
    @app = app 
    end 
    def call(env) 
    if env['SERVER_NAME'] =~ /^www\./ 
     @app.call(env) 
    else 
     [ 307, { 'Location' => 'https://www.my-domain-name.com/' }, '' ] 
    end 
    end 
end 

# config/environments/production.rb 
MyApp::Application.configure do 
    config.middleware.use Rack::Www 
    # the rest of the production config.... 
end 

Para probar esto en el navegador, puede editar el archivo de /etc/hosts en el equipo de desarrollo local

# /etc/hosts 
# ... 
127.0.0.1 my-domain-name.com 
127.0.0.1 www.my-domain-name.com 

ejecutar la aplicación en el modo de producción en el equipo de desarrollo local

$ RAILS_ENV=production rails s -p 80 

y vaya al http://my-domain-name.com/ y vea qué sucede.

Durante la prueba, es posible que desee comentar la línea que lo redirecciona al sitio HTTPS.

También puede haber formas de probar esto con las herramientas estándar de pruebas unitarias y pruebas de integración que utilizan muchos proyectos de Rails, como Test::Unit y RSpec.

+0

@Justice eres un salvavidas! Tengo rack-ssl funcionando fantásticamente. Preguntas de pareja ¿Está Www intencionalmente capitalizado de esa manera? ¿Puedo usar todas las tapas? Además, ¿hay alguna manera de redirigir a https .... y mantener el camino o es mucho riesgo? ¡¡¡gracias!!! – AnApprentice

+1

El 'Www' es mi preferencia. Siéntase libre de usar su propio estilo. – yfeldblum

+0

Sin duda, puede hacer que este código sea más completo, manteniendo intacto el esquema, el prefijo de ruta, la ruta y la cadena de consulta. Puede basarlo fácilmente en el código de rack-ssl https://github.com/josh/rack-ssl/blob/master/lib/rack/ssl.rb#L47. – yfeldblum

3

Pivotal Labs tiene algún middleware llamado Refraction que es un reemplazo de mod_rewrite, excepto que vive en su código fuente en lugar de su configuración de Apache.

Puede ser un poco exagerado para lo que necesita, pero maneja esto con bastante facilidad.

+1

El enlace de refracción está muerto – Nerian

0

Creo que el problema es que se está ejecutando en Heroku. Consulte la documentación de Heroku con respecto al Wildcard domains:

"Si desea que su aplicación responda a cualquier subdominio con su nombre de dominio personalizado (como en * .sudominio.com), deberá usar los comodines añadidos. . en ... "

$ heroku addons:add wildcard_domains 

también mirar Redirecting Traffic to Specific Domain:

" Si tiene varios dominios, o su aplicación tiene usuarios que acceden a él a través de su subdominio Heroku, pero más tarde cambió a su propio dominio personalizado , es probable que desee colocar a todos los usuarios en el mismo dominio con una redirección en un filtro anterior.Algo como esto hará el trabajo:"

class ApplicationController 
    before_filter :ensure_domain 

    TheDomain = 'myapp.mydomain.com' 

    def ensure_domain 
    if request.env['HTTP_HOST'] != TheDomain 
     redirect_to TheDomain 
    end 
    end 
end 
0

Prueba este

def check_uri 
    if Rails.env == 'production' && request && (request.subdomains.first != "www" || request.protocol != 'https://') 
    redirect_to "https://www.mysite.com" + request.path, :status => 301 and return 
    end 
end 
1

En Rails 3

#config/routes.rb 
Example::Application.routes.draw do 
    redirect_proc = Proc.new { redirect { |params, request| 
    URI.parse(request.url).tap { |x| x.host = "www.example.net"; x.scheme = "https" }.to_s 
    } } 
    constraints(:host => "example.net") do 
    match "(*x)" => redirect_proc.call 
    end 
    constraints(:scheme => "http") do 
    match "(*x)" => redirect_proc.call 
    end 
    # .... 
    # .. more routes .. 
    # .... 
end 
+0

El enlace está roto. – iamnotmaynard

+0

@iamnotmaynard Tengo el código correspondiente en mi respuesta. –

+0

Quizás, pero el enlace está roto. Sería bueno al menos tener en cuenta que en su respuesta, y si es posible, vincular a una fuente similar que profundiza para explicar el código. – iamnotmaynard

0

Su mejor opción sería la de establecer redirigir con su proveedor de DNS, por lo sucede mucho antes de que cualquier solicitud llegue a su servidor. Desde el Heroku Dev Center:

La redirección de subdominio genera un redireccionamiento permanente 301 al subdominio especificado para todas las solicitudes al dominio desnudo, por lo que todas las solicitudes actuales y futuras se enrutan correctamente y el nombre de host www completo se muestra en el campo de ubicación del usuario.

DNSimple proporciona una redirección URL conveniente ve aquí la reorientación de la heroku-sslendpoint.com dominio simple a la www.heroku-sslendpoint.com subdominio. enter image description here

Para la configuración apropiada en Heroku el subdominio www entonces debe haber un registro de referencia CNAME para yourappname.herokuapp.com.

No es solo DNSimple lo que hace esto. Mi proveedor de DNS es 123 Reg y lo admiten, pero llámelo web forwarding.

Cuestiones relacionadas