Вот общая схема функционирования:
Рисунок 1: Реализация WebDAV в Apache 1.3
Примечание: Тут и ниже DSO Loader означает “загрузчик модулей” (Dynamic Shared Object), а FS - файловая система (File System).
Модуль mod_dav в Apache 1.3 реализует всю функциональность, связанную с протоколом WebDAV. В качестве хранилища ресурсов и коллекций использовалась файловая система сервера.
Модуль mod_dav для Apache 1.3 не поставляется вместе с сервером. Скачать его можно здесь. А дополнительную информацию по mod_dav для Apache 1.3 можно получить тут
Теперь, если вам потребуется использовать какое-нибудь нестандартное хранилище ресурсов WebDAV, то нужно только создать соответствующий модуль, который будет использовать API модуля mod_dav.
Вот так это выглядит на схеме:
Рисунок 2: Реализация WebDAV в Apache 2.0
Примечание: Модули mod_dav и mod_dav_fs входят в дистрибутив сервера Apache 2.0. Дополнительную информацию о модуле mod_dav можно получить здесь, а о модуле mod_dav_fs - здесь.
Примечание: Модуль mod_dav_fs не нуждается в модуле mod_dav_lock, так как использует свою собственную реализацию базы блокировок. В качестве примера модуля, который использует API mod_dav_lock, можно привести модуль Subversion - mod_dav_fs.
Взглянем на схему реализации:
Рисунок 3: Реализация Apache в Apache 2.2
Примечание:Дополнительную информацию о модуле mod_dav_lock можно получить здесь.
Более же пристальный взгляд обратим на процесс настройки mod_dav, а именно на его директивы (все настройки производятся в файле httpd.conf):
Данная директива определяет файл базы данных блокировок. Файл создастся модулем автоматически, но каталог, указанный в директиве, должен существовать и должен быть доступен для записи процессу веб-сервера. Данная директива должна быть расположена либо в глобальном контексте сервера (вне секций <Directory>, <Location>), либо в контексте виртуального хоста (внутри секции <VirtualHost>).
Подробнее о контекстах конфигурации можно прочитать в статье "Взаимодействие модулей Apache с файлами конфигурации (httpd.conf и .htaccess)".
Директива DAVMinTimeout определяет минимальное время жизни блокировки (в секундах). В качестве параметра директивы принимает неотрицательное целое число. Это значение будет использовано, если клиент запросил создание блокировки на время меньшее, чем определено в DAVMinTimeout. Директива может применяться как в серверном контексте, так и в контексте каталога. По умолчанию DAVMinTimeout принимает значение 0, которое отключает проверку на тайм-аут.
Директива DAVDepthInfinity разрешает (on) или запрещает (off) использовать в заголовке Depth: значение Infinity. Значение Infinity в запросе PROPFIND может привести к длительной загрузке сервера, так как оно подразумевает получение свойств всех вложенных ресурсов произвольной глубины. Для предотвращения таких ситуаций необходимо использовать директиву DAVDepthInfinity off. Директива может применяться и в серверном контексте, и в контексте каталога.
Для предотвращения DoS атак, которые могут происходить при отправке серверу WebDAV запросов с телом большого размера, введена директива LimitXMLRequestBody. Она задает максимальный размер WebDAV запросов в байтах. Если значение директивы равно 0, то это означает, что ограничений нет. Данная директива может применяться и в серверном контексте, и в контексте каталога.
Более подробно про способы защиты от сетевых атак вы можете узнать в книге "Секреты хакеров. Безопасность сетей - готовые решения", (авторы - Стюарт Мак-Клар, Джоэл Скембрей, Джордж Курц, издательство Вильямс, серия Секреты хакеров, 2004, ISBN 5-8459-0603-2)
Это все директивы, которые предоставляет модуль mod_dav в Apache 1.3. Теперь взглянем на пример конфигурации сервера:
DAVLockDB /usr/local/apache/var/DAVLock
DAVMinTimeout 600
DAVDepthInfinity on
<Location /resources>
DAV On
<Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
Require user admin
</Limit>
</Location>
Данная конфигурация ограничивает работу модуля mod_dav только для тех запросов, URI которых начинается на /resources. Значения большинства директив в ней очевидны, поясню только назначение блока <Limit> - он разрешает выполнения методов WebDAV только пользователю admin.
В Apache 2.0 количество директив, используемых для настройки WebDAV, сократилось. Теперь модуль mod_dav предоставляет только 3 директивы:
Предназначение всех директив осталось такое же, поэтому останавливаться на них не будем, обратим внимание только на один нюанс. Теперь директива DAV в качестве параметра принимает имя модуля хранилища ресурсов. Но для совместимости также оставили значение On, которое означает подключение хранилища filesystem, реализованное в модуле mod_dav_fs.
Рассмотрим пример конфигурации (в качестве хранилища ресурсов будем использовать модуль Subversion - mod_dav_svn).
<Location /svn>
DAV svn
SVNParentPath /usr/local/svn
# Авторизация пользователя
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /path/to/users/file
# Ограничения HTTP методов для не авторизированных пользователей
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
В этой конфигурации как раз показывается пример использования нестандартного модуля хранилища ресурсов - mod_dav_svn.
Примечание: Имя “svn” задается в функции dav_register_provider.
А модуль mod_dav_lock предоставляет только одну директиву:
Теперь вы знаете, как в Apache реализована поддержка протокола WebDAV и знаете, как можно грамотно настроить поддержку протокола в любой версии сервера. В следующей статье мы детально рассмотрим устройство модуля mod_dav и попробуем разобраться, как можно создать собственный модуль хранилища ресурсов.