Autenticación de Apache: permitir el acceso público a un subdirectorio

13

Este es probablemente un problema simple, pero no puedo encontrar la solución en la documentación.

Quiero proteger con contraseña mi sitio web mediante la autenticación BASIC. Pero quiero que un subdirectorio no esté protegido:

http://mysite.com/ -> BASIC protected
http://mysite.com/somedir -> BASIC protected
http://mysite.com/someotherdir -> BASIC protected
http://mysite.com/public -> not protected

No tengo ningún problema para proteger todo el sitio, pero no sé cómo puedo "desproteger" un directorio. El sitio está alojado en un host compartido, por lo que solo tengo acceso a archivos .htaccess para realizar la configuración.

¿Existe una directiva para negar la autenticación?

Gracias por la ayuda ...

Guillaume
fuente
Esta parece ser la solución más correcta: stackoverflow.com/questions/2641646/…
BryanK

Respuestas:

10

No debería ser un problema con .htaccess, dependiendo de lo que el host haya permitido.

Puede intentar poner un .htaccess en la subcarpeta con lo siguiente, aunque las anulaciones tendrán que estar habilitadas para los directorios en los que se encuentra.

 Allow From All
 Satisfy Any
Cilíndrico
fuente
1
La salsa secreta aquí, IIRC, es poner el .htaccess en la raíz de su sitio, pero tener una entrada en ese archivo .htaccess como el que habla Cylindric.
Paul Lathrop
Y no olvide agregar (o asegurarse de que exista) un AllowOverride para que se use el .htaccess.
TCampbell
1
@Paul: he eliminado mi respuesta, pero la respuesta de AFAICR Cylindric es incorrecta. Un archivo .htaccess en un subdirectorio no puede anular uno más arriba. Sin embargo, el archivo .htaccess en el directorio principal también puede incluir controles (o incluso eliminarlos) para subdirectorios.
Alnitak
Intenté poner una directiva <Directorio /> en la carpeta raíz y en la carpeta que quiero que sea pública, pero en ambos casos obtengo un HTTP 500. ¿Alguna otra idea?
Guillaume
1
No puede usar <Directory> en .htaccess, aunque puede usar <Files> y <Location>
Alnitak
7

OK, para una ruta server.com/private/public:

server.com/private/.htaccess

AuthType Basic
AuthName "Private, keep out."
Require...

server.com/private/public/.htaccess

Allow From All
Satisfy Any

La clave aquí es 'Satisfacer a cualquiera', que OR cumple los requisitos de upstream juntos. 'Satisfacer todo' es el valor predeterminado.

CK.
fuente
Gracias por explicar 'Satisfy Any' 👍
Mario
1

Creo que esto podría hacerlo:

# put the global auth stuff here
...

# put the override here
<Location /public>
Allow from All
Satisfy Any
</Location>
Alnitak
fuente
Nunca es una buena idea usar <Location> s para el control de acceso. Solo controla el acceso a través de un nombre, en lugar del recurso en sí. Por lo tanto, cualquier cosa que proporcione acceso a él a través de un nombre diferente (Alias, por ejemplo) no tiene control de acceso aplicado.
CK.
1
@CK En realidad, debe usar Ubicación si la ubicación en cuestión no es un directorio físico sino simplemente un directorio "virtual" disfrazado por algo como mod_rewrite.
Natalie Adams el
0

Logré resolver esto haciendo esto:

<Directory "/path/to/maindirectory">
[... auth stuff ... ]
</Directory>

<Directory "/path/to/mysubdirectory">
 Allow from All
 Satisfy Any
</Directory>

NO use ubicaciones, ya que están hechas para distinguir entre mayúsculas y minúsculas y no actúan sobre el acceso real a la carpeta, sino solo sobre la URL.

Entonces, por ejemplo, si escribo

http:/mywebsite/STUFF

o

http://mywebsite/stuff

o

http://mywebsite/StUfF

¡Es diferente para el control de ubicación, incluso si el directorio físico llamado es el mismo!

En resumen, usted verifica el acceso al directorio "cosas" y puedo escribirlo con un caso diferente.

Además, usar el archivo .htaccess en un solo directorio con control de ubicación en otros no me funcionó.

Espero eso ayude.

xela92
fuente