Apache の RewriteMap ディレクティブを使用することをお勧めします。RewriteMap ディレクティブを使用するには、ディレクティブを .htaccess ファイルではなく httpd.conf に配置する必要があることに注意してください。いくつかの簡単な方法で使用できます。
プレーンテキストファイル
プレーン テキスト バージョンでは、IP アドレスを保持する .txt ファイルを使用できます。コメント用の行を追加しました。この方法では、自動期限切れは許可されません。
httpd.conf
RewriteEngine on
RewriteMap ipmap txt:/path/to/whitelist.txt
RewriteCond ${ipmap:%{REMOTE_ADDR}} !^allow$ [NC]
RewriteRule .* - [F,L]
whitelist.txt
# Chris London added this 2013/06/14
127.0.0.1 allow
123.45.67.89 allow # Some other comment
カスタムプログラム
RewriteMap を使用すると、実際に外部プログラムを実行させることができますが、これにはいくつかの注意事項があります。個人的には、特に PHP スクリプトでこの方法を使用したことはありません。PHP スクリプトで動作させるには、stdin の読み取りと stdout への書き込みを無期限に実行する必要があると思います。
RewriteEngine on
RewriteLock /path/to/rewrite.lock
Rewritemap ipmap prg:/path/to/executable.php
RewriteCond ${ipmap:%{REMOTE_ADDR}} !^allow$ [NC]
RewriteRule .* - [F,L]
実行可能.php
#!/usr/bin/php
<?php
$in = fopen('php://stdin', 'r');
$out = fopen('php://stdout', 'r');
while ($ip = fgets($f)) {
// TODO add better logic
if ($ip == '127.0.0.1') {
fwrite(out, 'allow');
} else {
fwrite(out, 'deny');
}
}
fclose($f);
- 書き換えマップ プログラムはできるだけ単純にしてください。プログラムがハングすると、httpd はマップからの応答を無期限に待機し、その結果、httpd は要求への応答を停止します。
- プログラムでバッファリングをオフにしてください。バッファリングされた I/O により、httpd が出力を待機するため、ハングします。
- サーバーの起動時に開始されるプログラムのコピーは 1 つしかないことに注意してください。すべてのリクエストは、この 1 つのボトルネックを通過する必要があります。多くのリクエストがこのプロセスを通過する必要がある場合、またはスクリプト自体が非常に遅い場合、これにより大幅な速度低下が発生する可能性があります。
DB クエリ
これもまだ使っていませんが、かなり綺麗です。これを機能させるには、適切なデータベースを指すように mod_dbd を構成する必要があります。IP アドレスを取得する SQL ステートメントがあり、有効期限のフィルターを追加できます。
RewriteEngine on
RewriteMap ipmap "dbd:SELECT ipaddress FROM rewrite WHERE expiration < TIME() and ipaddress = %s"
RewriteCond ${ipmap:%{REMOTE_ADDR}} !^%{REMOTE_ADDR}$ [NC]
RewriteRule .* - [F,L]
他にもいくつかのタイプがありますが、これらはあなたに最適なようです. 前に言ったように、カスタム プログラムや DB クエリを使用したことがないので、何か間違ったことを言っている可能性があります。ここにいる別のユーザーが私の間違いに気付くかもしれないので、これらすべてがうまくいくことを願っています。