Я унаследовал плохо разработанное веб-приложение, в котором есть определенный файл, который должен быть общедоступным, но этот файл находится внутри каталога, чего не должно быть.
Другими словами, мне нужен способ заблокировать все файлы и подкаталоги в каталоге, но переопределить его для одного файла.
Я пробую это:
# No one needs to access this directly
<Directory /var/www/DangerousDirectory/>
Order Deny,allow
Deny from all
# But this file is OK:
<Files /var/www/DangerousDirectory/SafeFile.html>
Allow from all
</Files>
</Directory>
Но это не работает - он просто блокирует все, включая файл, который я хочу разрешить. Какие-либо предложения?
# No one needs to access this directly
<Directory /var/www/DangerousDirectory/>
Order Deny,allow
Deny from all
</Directory>
# But this file is OK:
<Files /var/www/DangerousDirectory/SafeFile.html>
Order Deny,Allow
Allow from all
</Files>
И если этот каталог защищен паролем, добавьте Satisfy any
слишком.
На StackOverflow есть ответ, который должен ответить на этот вопрос, я думаю, что отсутствует Order
во вложенном Files
директива?
Очень поздний ответ, но, возможно, ответ.
Тег находится в области действия каталога и не должен иметь полного пути. Итак, это должно читаться:
<Directory "/var/www/DangerousDirectory">
Order Deny,allow
Deny from all
# But this file is OK:
<Files "SafeFile.html">
Allow from all
</Files>
</Directory>
Имейте в виду, что это позволит использовать любой файл с именем SafeFile.html в этом дереве каталогов.
Чтобы разрешить конкретный файл, когда доступ ограничен паролем HTTP. Будьте осторожны, защита паролем определяется на основе файловой системы, а определенные разрешенные файлы определяются URI. Обновлено для Apache 2.4.
<Directory /path/to/directory/>
AuthName SecureArea
AuthType Basic
AuthUserFile /path/to/passwd-file
Require user my-user
SetEnvIf Request_URI "path/to/uri-allowed-1.php" allowedURL
SetEnvIf Request_URI "path/to/uri-allowed-2.php" allowedURL
Require env allowedURL
</Directory>