LoginSignup
52
56

More than 5 years have passed since last update.

[Apache]mod_rewireにおけるクエリ文字列の切り出し方法

Last updated at Posted at 2014-03-06

mod_rewrite の RewriteRule ディレクティブの引数一つ目(遷移元URL)では、URLのクエリ文字列は評価されません。
例えば次のような書き方はできません。

.htaccess(NGな例)
RewriteEngine on

RewriteRule ^test.html?hoge=AAA /test2.html [L]

よって、クエリ文字列をURLの書き換え条件としたい場合は、いったん次のように切り出しておくと便利です。

.htaccess
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です。

.htaccess
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エラー)とする例です。

.htaccess
RewriteEngine on

RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]

RewriteCond %{ENV:X_QUERY_HOGE} !^AAA$
RewriteRule .* - [F]

これら以外にも、次のような用途でも利用できます。

  • リダイレクトする際に、引き継ぐクエリ文字列を絞る
  • Apacheのログに特定のクエリ文字列を記録する
    • CustomLog 設定で、切り出した環境変数を指定
52
56
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
56