Как использовать DAV и DirectoryIndex в Apache 2.4?
В моей конфигурации apache у меня есть виртуальный хост, настроенный следующим образом:
Alias /mediamanager /storage/files/mediamanager
<Directory /storage/files/mediamanager>
DirectoryIndex /mediaManagerIndex.php
DAV On
# ... And some authentication directives ... #
</Directory>
Идея состоит в том, что кто-то может обращаться к файлам как с помощью WebDAV-Client, так и с помощью простого веб-браузера, и в этом случае некоторый красивый вид каталога создается PHP script.
Это отлично работало в Apache 2.2, но недавно я обновился до Apache 2.4, и теперь он сломан. Я очень подозреваю, что я страдаю от этой ошибки, которой уже 2 года, и никаких исправлений не видно. Предлагаемое обходное решение для добавления:
<Limit PROPFIND>
DirectoryIndex never-encounterable-file-name.html
</Limit>
Не работает для меня. Вероятно, потому что я все еще хочу иметь индекс каталога. Если я удалю мой DirectoryIndex
вообще, WebDAV снова работает (в этом каталоге нет файлов index.html или подобных файлов), но, конечно, я теряю возможность использовать мой PHP файл в качестве индекса каталога. Я попытался указать свой DirectoryIndex в <Limit GET>
, но это не повлияло.
Есть ли способ заставить оба DAV и DirectoryIndex работать одновременно в Apache 2.4 на Debian (если возможно, без изменения исходного кода и перекомпиляции)?
Ответы
Ответ 1
Для меня следующая конфигурация разрешила обе проблемы:
- WebDAV снова работает
- индексирование каталога, если пользователь использует веб-браузер для доступа к репозиторию
Он работает путем ручного внедрения функции индексирования каталогов с помощью простых правил перезаписи, которые применяются только для метода запроса GET
.
Следующий код должен быть помещен в конфигурацию сервера или контекст виртуального хоста в файле конфигурации apache.
# Turn off (automatic) Directory-Indexing
DirectoryIndex disabled
RewriteEngine On
# Rewrite rules for the root directory
RewriteCond "%{REQUEST_METHOD}" "(GET)"
RewriteRule "^/$" "/index.php" [L]
# Rewrite rules for other sub-directories
RewriteCond "%{REQUEST_METHOD}" "(GET)"
# The following line checks, if the index.php file exists
RewriteCond "%{DOCUMENT_ROOT}/$1/index.php" "-f"
RewriteRule "^/(.*)/$" "/$1/index.php" [L]
Не забывайте перезагружать Apache!
Ответ 2
Чтобы исправить это, отключите индексирование каталога для сайта WebDAV.
В файле sites-available/site.conf добавьте DirectoryIndex disabled
в объявление <Directory>
, например:
<Directory /path/to/my/webdav/dir>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Require all granted
DirectoryIndex disabled
</Directory>
Затем просто перезагрузите Apache, и у вас больше не будет этой проблемы:
sudo service apache2 reload
Ответ 3
Для меня ответ был не совсем прав... Мне пришлось изменить ^/$и ^/(.)/$на ^/? $и ^/? (.)/$, чтобы он работал...
Ответ 4
Это решение, которое я сейчас использую, находится в файле .htaccess
в корне дерева каталогов, используемого службой WebDav. В этом случае я не использую PHP, только HTML файлы, но это может быть легко адаптировано:
# Turn off automatic directory indexing
Options -Indexes
DirectoryIndex disabled
# Redirect directory requests to index.html, only for GET requests
RewriteEngine On
RewriteCond %{REQUEST_METHOD} "GET"
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ $1index.html [L]
Чтобы всегда запускать запрошенный файл PHP, просто замените "index.html" в последней строке на имя файла PHP:
RewriteRule ^(.*)$ $1mediaManagerIndex.php [L]