On Fri, 5 Oct 2001, Lev Serebryakov wrote:
> Есть директория в которой файлы обрабатываются хэндлером:
> <Location /xslt>
> AddHandler my-handler .html .htm .txt
> DirectoryIndex news.html
> </Location>
>
> В этом каталоге _вообще_ нет html-файлов (они генерятся хэндлером).
> Так вот. Если news.html нету на диске, то просто выдается листинг
> каталога! А если есть (хотя бы и нулевой) -- то результат запроса
> (то есть, результат работы хэндлера -- все правильно) /news.html!
>
> Но это же не логично -- проверять наличие файла stat()'ом, а потом
> делать полноценный субреквест. Можно ли от этой глупости избавится?
> Это ведь mod_dir так глупо написан? Его переучить нельзя?
Нет, mod_dir написан не так. Опуская ненужные подробности, происходит
следущее. Для каждого directory index вызывается ap_sub_req_lookup_uri()
и если результат равен 200 и его finfo говорит, что это обычный файл,
то делается ap_internal_redirect() на этот directory index.
Если же ни чего не найдено, дело переходит к следущему
обработчику DIR_MAGIC_TYPE, как правило, это mod_autoindex.
Проблема решается двумя способами.
1. Делается обработчик DIR_MAGIC_TYPE и директива для его разрешения.
2. Делается обработчик фазы трансляции, реагирующий на специальное имя,
жёстко зашитое или же конфигурируемое. Примерно такой:
if (strcmp(r->uri, "index.xslt") == 0) {
r->finfo.st_mode |= IS_IFREG;
r->handler = "my-handler";
return OK;
}
Ну и хандлер контента, должен уметь реагировать на такое имя.
Игорь Сысоев
=============================================================================
= Apache-Talk@xxxxxxxxxxxxx mailing list =
Mail "unsubscribe apache-talk" to majordomo@xxxxxxxxxxxxx if you want to quit.
= Archive avaliable at http://www.lexa.ru/apache-talk =
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.