2009-03-09 22 views
5

Para evitar la duplicación de contenido, me gustaría evitar que varias URLs (con o sin barra al final) puedan acceder a las páginas de mi sitio.¿Cómo eliminar la barra diagonal de una URL en una aplicación de Rails? (en una vista de SEO)

Actualmente, las direcciones URL

catalog/product/1 

y

catalog/product/1/ 

conducen a la misma página. Mi objetivo es que la segunda URL redirija a la primera (redirección 301, por supuesto). Ninguna página de mi sitio debe ser accesible con una barra inclinada, excepto mi página de inicio/obviamente.

¿Cuál es la mejor manera de hacerlo? ¿Usando .htaccess o routes.rb? ¿Cómo lo harías tú?

NB: Estoy desarrollando con Ruby on Rails 1.2.3

Respuesta

9

Yo usaría Apache's mod_rewrite. Prueba esto:

RewriteEngine on 
RewriteRule ^(.+)/$ $1 [R=301,L] 

EDIT: Agregado R = 301. Supongo que hay una ventaja de SEO frente a la predeterminada 302.

+0

Gracias por la respuesta. Acabo de probarlo y observé un comportamiento extraño: ¡reescribe la URL y agrega la ruta absoluta de la página! Por ejemplo, si intento acceder a http://www.mysite.com/test/, redirige a http://www.mysite.com/home/mysite/public_html/test !! ¿Entiendes eso? – Flackou

+1

Hmm, es posible que deba agregar "RewriteBase /" antes de la línea RewriteRule. –

+0

Ok, funciona ahora. Muchas gracias por su ayuda. – Flackou

0

No se puede obtener una redirección usando routes.rb. Supongo que podrías construir un controlador que solo emita redirecciones y apunte todas las URL que terminan en '/', pero eso parece innecesariamente complicado. En su lugar, me gustaría usar mod_rewrite en un archivo .htaccess:

RewriteRule ^(.+)/$ $1 [R=301,L] 
15

Puede usar http://github.com/jtrupiano/rack-rewrite para que la reescritura de URL sea independiente de las diferencias en los servidores web.

Ejemplo de uso en la solicitud de raíles:

config.gem 'rack-rewrite', '~> 1.0.0' 
require 'rack/rewrite' 
config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do 
    r301 %r{(.+)/$}, '$1' 
end 
+3

En Rails 4, deberá reemplazar 'Rack :: Lock' con' Rack :: Runtime' (u otro), ya que 'Rack :: Lock' no está presente en el entorno de Raíles multiproceso habilitado de forma predeterminada en Rieles 4. –

Cuestiones relacionadas