2010-10-01 3 views
15

Ich versuche, eine Reihe von statischen URLs zu umleiten, und ich will es, ob der Schrägstrich arbeitet vorhanden ist:Apache Rewrite-Regel, die mit oder ohne abschließendes arbeitet Slash

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

I‘ ve die folgende versucht, und alle möglichen Variationen, aber ich habe immer ein Spiel nur mit dem Schrägstrich vorhanden erhalten:

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 

ich fühle mich wie ich offensichtlich etwas fehlt bin. Hilfe?

Antwort

27

Anders als in EBNF oder ABNF verweist ein Quantifizierer in regulären Ausdrücken auf den vorhergehenden Ausdruck und nicht auf den folgenden Ausdruck. Also:

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

Ha, ich wusste, dass es etwas dumm wie das war. :) Vielen Dank! –

+6

Das Fragezeichen lautet "Ich habe 0 oder 1 Schrägstriche." Du gehst in ein Restaurant und sagst "Ich werde einen Taco haben?" Du sagst wirklich "Ich werde 0 oder 1 Tacos haben." – bobobobo

+0

Arbeitete großartig für uns. Vielen Dank –

3

Versuchen

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

Wenn Sie foo/bar entsprechen, unabhängig davon wollen, ob sie von einem anderen Teil des Weges gefolgt ist, kann man sagen:

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

Dies wird übereinstimmen eines der folgenden Elemente:

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

Es bedeutet: entweder a) einen Schrägstrich, gefolgt von 0 oder mehr Zeichen, oder b) das Ende der Zeichenfolge.

Auf der anderen Seite, diese könnte unerwünscht sein:

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