Правило перезаписи Apache, которое работает с или без конечной косой черты - PullRequest
19 голосов
/ 02 октября 2010

Я пытаюсь перенаправить серию статических URL-адресов, и я хочу, чтобы он работал независимо от того, присутствует ли косая черта:

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

Я пробовал следующее, и все видывариации, но я всегда получаю совпадение только с присутствующим слешем:

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

Я чувствую, что упускаю что-то очевидное.Помощь

Ответы [ 4 ]

34 голосов
/ 02 октября 2010

За исключением EBNF или ABNF , квантификатор в регулярных выражениях ссылается на предыдущее выражение, а не на следующее выражение.

Итак:

RewriteRule ^foo/bar/?$ http://url.com/tacos
13 голосов
/ 05 июня 2011

Если вы хотите сопоставить foo / bar независимо от того, идет ли за ним другая часть пути, вы можете сказать:

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

Это будет соответствовать любому из следующего:

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

Это означает: соответствует либо a) косая черта, за которой следуют 0 или более символов, либо b) конец строки.

С другой стороны, это может быть нежелательно:

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
3 голосов
/ 02 октября 2010

Попробуйте

RewriteRule ^foo/bar/?$ http://url.com/tacos
1 голос
/ 22 мая 2018

Это также работает: RedirectMatch 301 /foo/bar(/.*|$) http://url.com/tacos

...