Я создаю простой черный список IP-адресов. Каждый запрос сравнивается со списком IP-адресов и выдает 403 при необходимости. Я решил разобраться с ним на стороне Apache с mod_rewrite
, его RewriteMap
и простым скриптом Python.
В VirtualHost
:
<VirtualHost *:80>
...
RewriteEngine On
RewriteMap banip prg:/path/to/script.py
RewriteCond ${banip:%{REMOTE_ADDR}} !=OK
RewriteRule ^/.* - [F]
</VirtualHost>
script.py:
#!/usr/bin/python
import sys
sys.stdout.write('OK\n')
sys.stdout.flush()
Теперь странная часть. После перезапуска Apache только первый запрос возвращает 200
, а каждый следующий запрос возвращает 403
. Я ожидаю, что все они вернутся 200
. Когда я перезагружаю Apache, то же самое происходит снова.
Переписать журнал после перезапуска Apache:
# Very first request
127.0.0.1 - (2) init rewrite engine with requested uri /app_dev.php/
127.0.0.1 - (3) applying pattern '^/.*' to uri '/app_dev.php/'
127.0.0.1 - (5) map lookup OK: map=banip key=127.0.0.1 -> val=OK
127.0.0.1 - (4) RewriteCond: input='OK' pattern='!=OK' => not-matched
127.0.0.1 - (1) pass through /app_dev.php/
...
# Request after that
127.0.0.1 - (2) init rewrite engine with requested uri /static/css/grid.css
127.0.0.1 - (3) applying pattern '^/.*' to uri '/static/css/grid.css'
127.0.0.1 - (5) map lookup OK: map=banip key=127.0.0.1 -> val=
127.0.0.1 - (4) RewriteCond: input='' pattern='!=OK' => matched
127.0.0.1 - (2) forcing responsecode 403 for /static/css/grid.css
При втором обновлении не записывается ничего для перезаписи журнала, просто сразу выбрасывается 403
.
Когда я пытаюсь RewriteCond OK !=OK
или RewriteCond NOTOK !=OK
, он отлично работает. Есть идеи, почему это происходит?
Я нахожусь на Xubuntu 11.10 с Apache 2.2.20 и Python 2.7.2.