Reescritura canónica de Apache con pasajero (mod_rails)

Reescritura canónica de Apache con pasajero (mod_rails)

Tengo una aplicación Rails servida a través de Passenger (mod_rails) y quiero tener una URL canónica.

Quiero que todas las solicitudes vayan ahttp://midominio.com(entonces, reescribehttp://www.midominio.comahttp://midominio.com).

En mis otras aplicaciones que no son Rails, lo logro usando mod_rewrite y un archivo .htaccess con lo siguiente:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(.+)mydomain\.com$ [NC]
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

Sin embargo, esto no parece funcionar con Passenger. Probé todo tipo de combinaciones para colocar el archivo .htaccess (en el directorio público) y mover las directivas (en la configuración de vhost), pero no puedo hacer que esto funcione.

¿Cómo puedo lograr esto?

Respuesta1

Intente reemplazar esa última línea por la siguiente:

Reescribir regla ^(.*)http://midominio.com%{REQUEST_URI} [R=permanente,QSA,L]

Si eso aún falla, recomiendo usar un host virtual separado para la URL www.midominio.com que simplemente reescribe midominio.com. Passenger no funciona bien con mod_rewrite.

Espero que esto ayude.

Respuesta2

ACTUALIZACIÓN: Aparentemente estaba ejecutando una versión anterior de Passenger (no sé cómo me perdí eso). ¡Actualmente estoy ejecutando Passenger 2.2.9 y poner la reescritura original en el vhost funciona como se esperaba (y deseaba)!

Discusión grupal de Google sobre soluciones para versiones anteriores de Passenger:http://groups.google.com/group/phusion-passenger/browse_thread/thread/5e019e5d65beb54f

Para versiones anteriores:

Aloje el servidor virtual wwwcomo un host independiente y redireccione (sugerencia de Jonathan Clarke)

RedirectMatch 301 ^(.*)$ http://mydomain.com$1

Haz la reescritura en la aplicación:

# before_filter :trim_www 
def trim_www 
  if request.subdomains.first == "www" 
    if request.subdomains == ["www"] 
      redirect_to "#{request.protocol}#{request. 
domain}#{request.port_string}#{request.path}" 
    else 
      subdomains = request.subdomains.shift.join(".") 
      subdomains << "." unless subdomains.blank? 
      redirect_to 
"#{request.protocol}#{subdomains}#{request.domain}#{request.port_string}#{r equest.path}" 
    end 
  end 
end 

(Apoyos a RSL en elpublicación originalpara este código)

información relacionada