mod_rewrite の RewriteRule ディレクティブの引数一つ目(遷移元URL)では、URLのクエリ文字列は評価されません。
例えば次のような書き方はできません。
RewriteEngine on
RewriteRule ^test.html?hoge=AAA /test2.html [L]
よって、クエリ文字列をURLの書き換え条件としたい場合は、いったん次のように切り出しておくと便利です。
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]
上記の例では、クエリ文字列のキー hoge
の値を、環境変数 X_QUERY_HOGE
にセットしています。
クエリ文字列ですので、キーがそれ以外も指定されることを考慮する必要があります。
例:http://example.com/test.html?hoge=1&piyo=2&fuga=3
.. 引数1つ目にhoge
例:http://example.com/test.html?piyo=2&hoge=1&fuga=3
.. 引数2つ目にhoge
例:http://example.com/test.html?piyo=2&fuga=3&hoge=1
.. 引数3つ目にhoge
よって (^|&)
でクエリ文字列の「先頭」もしくは「&の後」とし、同様に ($|&)
でクエリ文字列の「最後」もしくは「&の前」とすることで、キーが複数指定された場合でも正確に切り出すことができます。
後は環境変数 X_QUERY_HOGE
の値を判定してURLの書き換えをすればOKです。
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]
RewriteCond %{ENV:X_QUERY_HOGE} ^AAA$
RewriteRule ^test.html$ /test2.html [L]
また下記は、URLの書き換えではありませんが、クエリ文字列 hoge=AAA
がなければアクセス禁止(403エラー)とする例です。
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]
RewriteCond %{ENV:X_QUERY_HOGE} !^AAA$
RewriteRule .* - [F]
これら以外にも、次のような用途でも利用できます。
- リダイレクトする際に、引き継ぐクエリ文字列を絞る
- Apacheのログに特定のクエリ文字列を記録する
- CustomLog 設定で、切り出した環境変数を指定