Я создал 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
серверная переменная, без упреждения.
Это также похоже на вывод, который вы видите в журнале сервера.