¿Cómo utilizar la autenticación básica para un solo archivo en un directorio Apache que de otro modo estaría prohibido?

¿Cómo utilizar la autenticación básica para un solo archivo en un directorio Apache que de otro modo estaría prohibido?

Quiero permitir el acceso a un único archivo en un directorio que de otro modo estaría prohibido.

Esto no funcionó:

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

Cuando lo visito, http://example.com/admin/allowed.phpaparece el mensaje Prohibido del http://example.com/admin/directorio, pero no la ventana emergente de inicio de sesión del navegador de la autenticación básica, por lo que la autenticación básica no funciona en el archivo. ¿Cómo puedo hacer una excepción para permitido.php?

Si no es posible, ¿tal vez podría enumerar todos los archivos prohibidos en otra directiva de Archivos?

Digamos que admin/ también contiene user.php y admin.php, que deberían estar prohibidos en este host virtual.

Editar:También probé la siguiente modificación, intentando seguir los consejos de la respuesta de Ignacio, con el mismo resultado 'Prohibido':

  ...

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

Respuesta1

Prueba esto:

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

Los archivos anidados dentro de un directorio solo se aplicarán allí para que su bloque de código esté organizado de manera más lógica, y creo que usar 'Satisfacer cualquiera' permitirá que se fusionen según lo planeado. No estoy seguro de si realmente es necesario, así que pruébalo con y sin la línea de satisfacción...

Respuesta2

No estoy seguro de que la solución <Files xxx>realmente funcione bien, ya queRequerir página de documentoafirma que no se aplica aFiles

Context:    directory, .htaccess

En cambio, lo que sugiere el documento de Apache es crear un directorio separado para el archivo:

Eliminar controles en subdirectorios

El siguiente ejemplo muestra cómo utilizar la directiva Satisfy para deshabilitar los controles de acceso en un subdirectorio de un directorio protegido. Esta técnica debe usarse con precaución, porque también deshabilitará cualquier control de acceso impuesto por 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>

información relacionada