Работая над сайтом dev для клиента, мы хотим отказать ему в доступе, но разрешить легкий белый список, когда он не работает для встреч или работает из дома (динамический ip).
То, что мы хотим, имеет форму, которая записывает ваш IP-адрес в файл htaccess вместе с комментарием над ним, в котором указывается, кто это или кто его санкционировал.
Не вдаваясь в кучу деталей, простой пароль не будет работать в нашем случае, если люди будут отслеживать учетные записи электронной почты для запросов, если клиенты получат свои собственные IP-адреса, такие вещи просто не летают.
Что было бы неплохо, это позволяет этим добавленным IP-адресам в htaccess истекать. Поэтому я считаю, что сложная логика вроде бы не летает в htaccess, поэтому ей нужно будет управлять сторонним программным обеспечением, если у кого-нибудь нет других идей?
Я рекомендую использовать директиву Apache RewriteMap. Обратите внимание, что для использования директивы RewriteMap вы должны поместить директиву в httpd.conf и NOT .htaccess. Вы можете использовать его несколькими простыми способами.
Версия простого текста позволяет вам иметь .txt-файл, содержащий IP-адреса. Я добавил строку для комментария. Этот способ не позволяет автоматически истекать.
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]
executable.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);
Я еще не использовал этот, но он выглядит довольно аккуратно. mod_dbd необходимо настроить для указания правильной базы данных, чтобы это работало. У вас есть оператор SQL, который извлекает IP-адреса, и вы можете добавить фильтр для даты истечения срока действия.
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]
Есть пара других типов, но они кажутся вам наиболее подходящими. Как я уже говорил, я раньше не использовал пользовательскую программу или запрос БД, поэтому я, возможно, сказал что-то не так. Надеюсь, другой пользователь здесь может поймать мою ошибку, чтобы все это сработало для вас.