Назад | Перейти на главную страницу

Apache2 - разрешить доступ только к файлам .pdf и индексам в WebDAV

Я создал WebDAV с apache2, чтобы использовать его с Zotero. Поскольку мы хотим только загружать и скачивать PDF-файлы через этот webdav, я хочу предотвратить загрузку или загрузку любых других файлов, кроме файлов PDF. Для этого я использовал:

<Location *>
        AuthType Basic
        AuthName DAV
        AuthUserFile "*"
        Require valid-user
        RewriteEngine On
        RewriteRule !(\.pdf)$ - [F,NC] # only allow access to pdf to prevent misuse
</Location>

Это отлично работает до тех пор, пока Zotero не проверит, есть ли у вас доступ к DAV, который он проверяет, вызывая базовый URL-адрес, например bla.com/zotero. В этой конфигурации пользователю не разрешено посещать индекс DAV. Как мне поменять RewriteRules чтобы разрешить только файлы pdf и индекс каталога? Я пробовал добавить RewriteCond %{REQUEST_FILENAME} !-d и еще кое-что, но это не сработало, по-прежнему 403 для индекса.

Благодаря нашей настройке FilesMatch директива, похоже, не работает, поэтому мы должны придерживаться RewriteRules на данный момент.

Спасибо большое за вашу помощь!

Я пробовал добавить RewriteCond %{REQUEST_FILENAME} !-d ...

Директивы в контексте сервера (или vHost) выполняются перед запрос был сопоставлен с файловой системой, поэтому REQUEST_FILENAME Переменная сервера еще не содержит путь файловой системы, которому соответствует URL-адрес (он просто содержит URL-адрес).

Чтобы проверить путь файловой системы в контексте сервера (независимо от того, соответствует ли он файлу или каталогу), вам необходимо вместо этого использовать упреждающий просмотр. Вместо этого попробуйте следующее:

RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule !(\.pdf)$ - [F,NC,NS]

NB: будьте осторожны с комментариями в конце строки; они не поддерживаются Apache.

В NS (nosubreq) флаг на RewriteRule директива необходима для предотвращения блокировки подзапросов. Когда mod_autoindex генерирует список каталогов, он также делает дополнительные подзапросы для каждого файла в каталоге, чтобы получить размер файла, последние измененные временные метки и т. Д. Вам необходимо предотвратить запуск проверки mod_rewrite по этим подзапросам.

ОБНОВИТЬ: С флагом NS и без посмотри вперед, вроде работает! Но почему это так? Как вы объяснили, нужно обязательно смотреть вперед?

Если эти директивы действительно находятся внутри <Directory> или <DirectoryMatch> контейнер (другими словами, они находятся в каталог контекст, такой же, как .htaccess) тогда вам нужно будет использовать простой REQUEST_FILENAME серверная переменная, без упреждения.

Это также похоже на вывод, который вы видите в журнале сервера.