web-dev-qa-db-ja.com

末尾のスラッシュの有無にかかわらず機能する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

明らかな何かが欠けているような気がします。助けて?

20
Luke Dennis

[〜#〜] ebnf [〜#〜] または [〜#〜] abnf [〜#〜] 以外では、正規表現の数量詞は前の式を参照します次の式ではありません。

だから:

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

パスの別の部分が後に続くかどうかに関係なく、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
13
fulv

これも機能します:RedirectMatch 301 /foo/bar(/.*|$) http://url.com/tacos

1
Cragmonkey