2010-10-01 4 views
15

Sto cercando di reindirizzare una serie di URL statici, e voglio farlo funzionare o meno la barra finale è presente:Apache regola di riscrittura che funziona con o senza lo slash

/foo/bar ---> /tacos 
/foo/bar/ --> /tacos 

I' ve provato la seguente, e ogni sorta di variazioni, ma ottengo sempre una corrispondenza solo con la slash presente:

RewriteRule ^foo/bar?/$ http://url.com/tacos 
RewriteRule ^foo/bar(?/)$ http://url.com/tacos 
RewriteRule ^foo/bar*/$ http://url.com/tacos 
RewriteRule ^foo/bar(*/)$ http://url.com/tacos 

mi sento come se mi manca qualcosa di ovvio. Aiuto?

risposta

27

Diverso da EBNF o ABNF, un quantificatore nelle espressioni regolari fa riferimento all'espressione precedente e non alla seguente espressione. Quindi:

RewriteRule ^foo/bar/?$ http://url.com/tacos 
+0

Ah, ho capito che era qualcosa di stupido come quello. :) Grazie! –

+6

Il punto interrogativo dice "Avrò 0 o 1 barra finale". Vai in un ristorante e dici "Avrò un taco?" Stai davvero dicendo "Avrò 0 o 1 tacos". – bobobobo

+0

ha funzionato alla grande per noi. Grazie –

3

Prova

RewriteRule ^foo/bar/?$ http://url.com/tacos 
13

Se si desidera far corrispondere foo/bar indipendentemente dal fatto che è seguita da un'altra parte del percorso, si può dire:

RewriteRule ^foo/bar(/.*|$) http://url.com/tacos 

Questo corrisponderà uno dei seguenti:

foo/bar 
foo/bar/ 
foo/bar/baz 

Significa: corrisponde a a) una barra seguita da 0 o più caratteri o b) alla fine della stringa.

D'altra parte, questi potrebbero essere indesiderabile:

RewriteRule ^foo/bar/? http://url.com/tacos  # This also matches foo/barb 
RewriteRule ^foo/bar/?$ http://url.com/tacos # This will not match foo/bar/baz