Правило перезаписи Apache, которое работает с завершающей косой чертой или без нее

Я пытаюсь перенаправить серию статических 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

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

Ответы

Ответ 1

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

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

Ответ 2

Если вы хотите совместить 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

Try

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