RedirectMatch
mod_aliasのディレクティブはクエリ文字列とは一致せず、その/index.html
部分のみが一致します。RewriteCond ${QUERY_STRING} <regexp>
それに対して一致させるには a を使用する必要があります。しかし、そのようにリダイレクトすると、URI が変更されないままになるまで URI が書き換えエンジンを通過するため、ループが発生します。
- ユーザーは URL アドレス バーに http://example.com/index.html?album=rockstar と入力します
- ブラウザがhttp://example.com/songs/album/rockstar.htmlにリダイレクトされる
- mod rewrite は
/songs/album/rockstar.html
それを見て書き換えます/index.html?album=rockstar
- リダイレクト ルールは正常に一致します
/index.html?album=rockstar
- 手順 2 から繰り返します。
/index.html?album=rockstar
実際のリクエストが に対するものであり、書き換えエンジンを通過したときではない場合にのみリダイレクトするようにする必要があります。
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\?album=(.+)\ HTTP
RewriteRule ^index\.html$ http://example.com/songs/album/%1.html? [R=301,L]
%{THE_REQUEST}は実際の HTTP 要求であり、書き換えられた URI ではありません。%1は、前の一致への後方参照でありRewriteCond
、? リダイレクト URL の最後にある はRewriteRule
、クエリ文字列を末尾に追加しないように指示します。