mod_rewriteで特定のクエリパラメータを削除する

.htaccess などで特定のクエリパラメータを削除する書き方メモ。
以下は、携帯サイトで意図せず余計なパラメータが付加されてしまうことで裏にあるキャッシュシステムのヒット率が下がってしまうという問題の対策に使っている設定です。

# 不要パラメータを削除する
RewriteCond %{QUERY_STRING} ^(.*&)?(?:uid|sid|pid)=[^&]*&?(.*)?$
RewriteRule (.*) $1?%1%2 [N]

[N]は普段あまり使わないフラグですがNextの意味で、書き換えが発生したときに最初のルールから*1やり直すという命令です。これを使うとループが書けるようになります。但し無限ループを作らないよう気を付けましょう。
あと、当然ですがここで設定したuidパラメータ等が必要なページがある場合は除外するようRewriteCondを追加したりします。

蛇足

例えば冒頭の設定は最初は[N]を使わずに以下のようにバラして書こうと思うかもしれません。

RewriteCond %{QUERY_STRING} ^(.*&)?uid=[^&]*&?(.*)?$
RewriteRule (.*) $1?%1%2
RewriteCond %{QUERY_STRING} ^(.*&)?sid=[^&]*&?(.*)?$
RewriteRule (.*) $1?%1%2
RewriteCond %{QUERY_STRING} ^(.*&)?pid=[^&]*&?(.*)?$
RewriteRule (.*) $1?%1%2

しかしコレには問題があって、uid=a&uid=b&uid=c&isd=A&sid=B のように同じルールが複数回マッチする場合は最初のひとつしか削除されません。このようなケースではマッチしなくなるまで繰り返し書き換えが必要なので[N]を使う必要があります。
で、そのついでに3つのルールを一つの正規表現に纏めたのが最初の設定になります。

*1:『最初のルールから』:ドキュメントにはこう書いてありますが、ここで言う最初のルールというのはこのRewriteRuleに関連する最初のRewriteCond(ルール)という意味で、[N]を付けたRewriteRuleより前に記述しているかもしれない関係無いRewriteRuleまでが繰り返されるわけではありません。