Como usar a autenticação básica para um único arquivo em um diretório Apache proibido?

Como usar a autenticação básica para um único arquivo em um diretório Apache proibido?

Quero permitir o acesso a um único arquivo em um diretório que de outra forma seria proibido.

Isso não funcionou:

<VirtualHost 10.10.10.10:80>
  ServerName example.com

  DocumentRoot /var/www/html

  <Directory /var/www/html>
    Options FollowSymLinks
    AllowOverride None
    order allow,deny
    allow from all
  </Directory>

  # disallow the admin directory: 
  <Directory /var/www/html/admin>
    order allow,deny
    deny from all
  </Directory>

  # but allow this single file:: 
  <Files      /var/www/html/admin/allowed.php>
      AuthType basic
      AuthName "private area"
      AuthUserFile /home/webroot/.htusers
      Require user admin1
  </Files>

  ...
</VirtualHost>

Quando eu visito, http://example.com/admin/allowed.phprecebo a mensagem Proibida do http://example.com/admin/diretório, mas não o pop-up de login do navegador da autenticação básica, portanto a autenticação básica não funciona no arquivo. Como posso abrir uma exceção para permitido.php?

Se não for possível, talvez eu possa enumerar todos os arquivos proibidos em outra diretiva Arquivos?

Digamos que admin/ contenha também user.php e admin.php que deveriam ser proibidos neste host virtual.

Editar:Também tentei a seguinte modificação, tentando seguir o conselho da resposta de Ignacio, com o mesmo resultado 'Proibido':

  ...

  # disallow the admin directory: 
  <Directory /var/www/html/admin>
    order allow,deny
    deny from all
  </Directory>

  # but allow this single file:: 
  <Files      /var/www/html/admin/allowed.php>
      order allow,deny
      allow from all
      AuthType basic
      AuthName "private area"
      AuthUserFile /home/webroot/.htusers
      Require user admin1
      satisfy all
  </Files>
  ...

Responder1

Experimente isto:

<Directory /var/www/html/admin>
  <Files allowed.php>
    AuthType basic
    AuthName "private area"
    AuthUserFile /home/webroot/.htusers
    Require user admin1
  </Files>
  order allow,deny
  deny from all
  satisfy any
</Directory>

Os arquivos aninhados dentro de um diretório serão aplicados apenas nele, para que seu bloco de código seja organizado de forma mais lógica, e acho que usar 'Satisfazer qualquer' permitirá que eles sejam mesclados conforme planejado. Não tenho certeza se é realmente necessário, então tente com e sem a linha de satisfação...

Responder2

Não tenho certeza se a solução <Files xxx>realmente funciona bem, pois oExigir página de documentoafirma que não se aplica aFiles

Context:    directory, .htaccess

Em vez disso, o que o documento do Apache sugere é criar um diretório separado para o arquivo:

Removendo controles em subdiretórios

O exemplo a seguir mostra como usar a diretiva Satisfy para desabilitar controles de acesso em um subdiretório de um diretório protegido. Esta técnica deve ser usada com cautela, pois também desabilitará quaisquer controles de acesso impostos pelo mod_authz_host.

<Directory /path/to/protected/>
    Require user david
</Directory>
<Directory /path/to/protected/unprotected>
    # All access controls and authentication are disabled
    # in this directory
    Satisfy Any
    Allow from all
</Directory>

informação relacionada