2009-03-09 8 views
5

Per evitare la duplicazione dei contenuti, vorrei evitare che le pagine del mio sito siano accessibili da diversi URL (con o senza barra finale).Come rimuovere la barra finale di un URL in un'app Rails? (in una vista SEO)

Attualmente, gli URL

catalog/product/1 

e

catalog/product/1/ 

portano alla stessa pagina. Il mio obiettivo è che il secondo URL reindirizzi al primo (reindirizzamento 301, ovviamente). Nessuna pagina del mio sito dovrebbe essere accessibile con una barra finale, tranne la mia home page/ovviamente.

Qual è il modo migliore per farlo? Utilizzando .htaccess o routes.rb? Come lo faresti?

NB: sto sviluppando con Ruby on Rails 1.2.3

risposta

9

userei Apache's mod_rewrite. Prova questo:

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

EDIT: Aggiunto R = 301. Suppongo che ci sia un vantaggio SEO rispetto a quello predefinito 302.

+0

Grazie per la risposta. L'ho appena testato e ho osservato uno strano comportamento: riscrive l'URL aggiungendo il percorso assoluto della pagina! Ad esempio, se provo ad accedere a http://www.mysite.com/test/, reindirizza a http://www.mysite.com/home/mysite/public_html/test !! Lo capisci? – Flackou

+1

Hmm, potrebbe essere necessario aggiungere "RewriteBase /" prima della riga RewriteRule. –

+0

Ok, ora funziona. Grazie mille per il tuo aiuto. – Flackou

0

Non è possibile ottenere un reindirizzamento utilizzando routes.rb. Suppongo che potresti creare un controller che limita i reindirizzamenti e punta tutti gli URL che finiscono in "/", ma sembra inutilmente complicato. Invece, vorrei usare mod_rewrite in un file .htaccess:

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

È possibile utilizzare http://github.com/jtrupiano/rack-rewrite per riscrivere l'URL in modo indipendente dalle differenze nei server Web.

Esempio di utilizzo in applicazioni Rails:

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

In Rails 4, dovrai sostituire 'Rack :: Lock' con' Rack :: Runtime' (o un altro), dato che 'Rack :: Lock' non è presente nell'ambiente Rails multi-threaded abilitato di default in Rotaie 4. –