PHP等のURLパラメータでIP制限やBASIC認証を設定する

Apacheで特定のQueryString(URLパラメータ)でIP制限などの制御をする

ApacehでIP制限をしているページがあり、そのページにアクセスがある場合、特定のパラメータを付きだとIP制限をせずにアクセスしたいって要望がありました。できれば「.htaccess」で制御したいって事でした。

<Directory>、<Location>、<File>のディレクティブを使えば簡単と思ったけどハマりました。下記の記事の<Directory>、<Location>、<File>のディレクティブの「.htaccess」は使えません

<Directory>, <Location> が.htaccessでは使えない

Rewriteを使って特定のQueryString(URLパラメータ)でIP制限などの制御をする

調べてみると、Rewriteを使って特定のパラメータがあると環境変数を付与して、その環境変数で「Deny from env=〜〜」とかで制御すればできることがわかりました。実際には下記のように設定にしました

http://example.com/test.php?secret=129319 とかのURLにアクセスすると、「secret=」がある場合はIP制限を無視しています。

$ sudo vi /etc/httpd/conf/httpd.conf 

RewriteEngine on
RewriteCond %{QUERY_STRING} secret=
RewriteRule (.*) $1 [E=secret_access:1]

<Files ~ "test.php$">
  Order Deny,Allow
  Deny from all
  Allow from <許可するIPアドレス>
  Allow from env=secret_access
</Files>

Rewriteを使って特定のQueryString(URLパラメータ)でBASIC認証を設定する

この応用でBASIC認証でも使えます。
下記の場合は、http://example.com/test.php?secret=129319 とかのURLにアクセスして、「secret=」がある場合はBASIC認証をかけています。
「secret=」がない場合はBASIC認証をおこなわない設定です

$ sudo vi /etc/httpd/conf/httpd.conf 

RewriteEngine on
RewriteCond %{QUERY_STRING} secret=
RewriteRule (.*) $1 [E=secret_access:1]

<Location />
  Order allow,deny
  Allow from All
  Deny from env=secret_access

  AuthUserFile /var/www/html/test/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Please enter your ID and password"
  AuthType Basic
  require valid-user

  Satisfy Any
</Location>

 

スポンサーリンク