Livingdeadの日記: ApacheでURLのクエリ文字列によりアクセス制限 3
日記 by
Livingdead
あるPHPスクリプトがあるURLで呼び出されたとき、パラメータ部分というかクエリ文字列によってアクセス制限をしたくなった。具体的にはindex.phpがaction=editで呼び出されたときには特定のIPアドレス以外からのアクセスを弾きたい。
RewriteEngine On
RewriteCond %{QUERY_STRING} action=edit
RewriteRule /index.php /index.php [E=EDIT:TRUE]
<LocationMatch "/index.php">
Allow from 192.168.0.1
Deny from env=EDIT
</LocationMatch>
久しぶりにmod_rewriteを使ってみたのだが、これでいいのだろうか。
まぁとなりのPCから編集されてもさほど困るわけではないのだが…
mod_setenvif (スコア:2)
動けばそれでいいとも言えますが、環境変数をセットするだけに mod_rewrite 使うのは、ドライバーがあるのにスイスアーミーナイフを持ち出してるみたいですね。
SetEnvIf [apache.jp]を使えば、
SetEnvIf Request_URI "action=edit" EDIT=True
みたいな感じで書けるんじゃないでしょうか。
もちろん、アクセス制御のところはそのままで。
SetEnvIfのRequest_URIには?以降は含まれないようです (スコア:1)
SetEnvIfのRequest_URIには?以降は含まれないようです。
/index.php?action=edit にマッチするのは
"action=edit" ではなくむしろ "^/index.php$" です。
LocationMatch における正規表現文字列とのマッチングでも
その対象は?の前、つまりパス部分(RFC3986のabs_path)だけのようです。
屍体メモ [windy.cx]
Re:SetEnvIfのRequest_URIには?以降は含まれないようです (スコア:2)
あ、そうなんですか。どうも、失礼いたしました。
そんなこと、マニュアルに書いてないじゃんと思って、英語の方で確認したら、
に続けて、query string にマッチさせたかったら mod_rewrite を使えと書いてありますね。
やっぱりスイスアーミーナイフが必要なんだ。
#Apache の和訳も最近滞っているみたいだなぁ。