RewriteMap prg mod_rewrite работает только для первого запроса - PullRequest
1 голос
/ 06 декабря 2011

Я создаю простой черный список 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.

1 Ответ

4 голосов
/ 06 декабря 2011

Я думаю, что вы, возможно, захотите взглянуть на документацию RewriteMap .В частности:

Эта программа запускается один раз, когда запускается сервер Apache, а затем связывается с механизмом перезаписи через дескрипторы файлов stdin и stdout.Для каждого поиска по карте-функции он получит ключ для поиска в виде строки с завершающей новой строкой в ​​stdin.Затем он должен вернуть искомое значение в виде строки с завершающей новой строкой на stdout или четырехсимвольной строки `` NULL '', если он потерпит неудачу (т. Е. Для данного ключа нет соответствующего значения).

Итак, ваша программа запускается один раз, получает ключ от Apache, генерирует ответ, а затем выходит .Как видно из документации, не будет перезапущен .

Ваша программа должна выполнить цикл, считывая строку ввода, генерируя вывод, а затем ожидая большего ввода.Связанная документация содержит очень короткий пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...