Подтвердить что ты не робот

Как использовать 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 (если возможно, без изменения исходного кода и перекомпиляции)?

4b9b3361

Ответ 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]