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

Apache2: Как ограничить доступ к каталогу, но разрешить доступ к одному файлу в нем?

Я унаследовал плохо разработанное веб-приложение, в котором есть определенный файл, который должен быть общедоступным, но этот файл находится внутри каталога, чего не должно быть.

Другими словами, мне нужен способ заблокировать все файлы и подкаталоги в каталоге, но переопределить его для одного файла.

Я пробую это:

# 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 директива?

https://stackoverflow.com/questions/6243677/apache-how-to-deny-directory-but-allow-one-file-in-that-dirctory

Очень поздний ответ, но, возможно, ответ.

Тег находится в области действия каталога и не должен иметь полного пути. Итак, это должно читаться:

<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>