On Fri, 11 Oct 2002, BeerBong wrote:
> Вот тестовая схема, которая работает на mod_proxy и не работает на
> mod_accel - проверено.
>
> httpd.conf
> ------------------
> <VirtualHost>
> ServerName test_server
> DocumentRoot /usr/web/test_server/data
> <IfModule mod_dir.c>
> DirectoryIndex index.html index.asp
> </IfModule>
> <IfModule !mod_perl.c>
> RewriteEngine On
> RewriteRule ^(.*\.asp)$ http://test_server:81$1 [P,L]
> </IfModule>
> <IfModule mod_perl.c>
> PerlModule Apache::Test
> <Location /index.asp>
> SetHandler perl-script
> PerlHandler Apache::Test
> </Location>
> </IfModule>
> </VirtualHost>
Эта схема работает следующим образом. mod_dir пытается найти индекс для "/"
и последовательно делает сабреквесты для index.html (опаньки) и
index.asp (файл с таким именем нашёлся). Как я уже писал, стандартный
mod_rewrite игнорирует прокированные правила для сабреквестов.
Найдя индекс, mod_dir делает внутренний редирект на /index.asp.
Так как это уже не сабреквест, то он обрабатывается mod_rewrite'ом
и в результате уходит к бэкенду.
Я считаю эту схему неправильной, так как работает она только тогда, когда
DocumentRoot фронтенда и бэкенда совпадают. Если же их разнести, то
на фронтенде придётся дублировать ирерахию пустых каталогов бэкенда
и в каждый из них помещать пустой index.asp.
> Когда index.asp отсутвует - действительно не срабатывает, но как
> только мы его туда кладем сервер на запрос "/" выдает "Hello from
> backend!" на mod_proxy и продолжает говорить Forbidden на mod_accel.
Что подтверждает мои слова выше.
На мой взгляд, лучше добавить правило, которое бы прокидывало запросы,
кончающиеся на "/", на бэкенд, и уже бэкенд искал бы для них индексы.
Или же сразу же прокидывать их на индексы.
> А если поведение непатченного mod_rewrite отличается достаточно
> сильным образом от патченного, то это скорее баг чем фича...
mod_accel патчит mod_rewrite на предмет проксирования сабреквестов,
но это не необходимость, а бонус. То есть, для mod_accel это
непринципиально. Если это не нужно, то достаточно убрать #ifndef/#endif
из mod_rewrite:
if (r->main != NULL &&
(p->flags & RULEFLAG_IGNOREONSUBREQ ||
#ifndef MOD_ACCEL
p->flags & RULEFLAG_PROXY ||
#endif
p->flags & RULEFLAG_FORCEREDIRECT )) {
continue;
}
Игорь Сысоев
http://sysoev.ru
=============================================================================
= Apache-Talk@lists.lexa.ru mailing list =
Mail "unsubscribe apache-talk" to majordomo@lists.lexa.ru if you want to quit.
= Archive avaliable at http://www.lexa.ru/apache-talk =