Cómo restringir el acceso al directorio y subdirecciones


42

Necesito restringir el acceso a cualquier archivo o subdirectorio en el directorio "testdir". Mi conf:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

En mi configuración no tengo restricciones en / testdir / jpg_or_txt-files. ¿Cómo hacerlo?


Tenga en cuenta que, en mi experiencia, la función de ubicación solo funciona correctamente cuando se ejecuta nginx en Linux. Cuando se ejecuta en Windows, tuvimos problemas con esto no funciona ...
samsmith

Respuestas:


43

para restringir el acceso a múltiples directorios en nginx en una entrada de ubicación hacer

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

77
Debería devolver 403 y no 404.
Stillmatic1985

12
Esto no responde a la pregunta en absoluto.

1
devolver 403 da una pista de que la carpeta existe, un 404 no muestra evidencia de que la carpeta exista en absoluto
Don Wilson

23

Esto se debe a que la directiva "raíz" coincide antes de que la directiva "denegar" pueda coincidir. Invierta el orden de sus directivas y debería funcionar:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

16

Para asegurarse de que se elige la coincidencia testdir en lugar de la coincidencia jpg / txt, use las siguientes ubicaciones:

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

En su ejemplo, tiene dos tipos de ubicaciones. location /testdires una ubicación de prefijo, ya que no tiene tilde ( ~) entre locationy /testdir.

location ~* ^.+\.(jpg|txt)$es una ubicación de expresiones regulares (no distingue entre mayúsculas y minúsculas, debido a que está *directamente detrás de la tilde). De la documentación de nginx :

Para encontrar una ubicación que coincida con una solicitud determinada, nginx primero verifica las ubicaciones definidas utilizando las cadenas de prefijo (ubicaciones de prefijo). Entre ellos, se selecciona y recuerda la ubicación con el prefijo coincidente más largo. Luego se verifican las expresiones regulares, en el orden de su aparición en el archivo de configuración. La búsqueda de expresiones regulares termina en la primera coincidencia y se utiliza la configuración correspondiente. Si no se encuentra una coincidencia con una expresión regular, se utiliza la configuración de la ubicación del prefijo recordada anteriormente.

El problema aquí es que su ubicación testdir se está recordando, pero luego la ubicación jpg / txt se selecciona durante la etapa de expresión regular, ya que coincide. La siguiente nota de la documentación es en lo que basé mi solución (dada anteriormente):

Si la ubicación de prefijo coincidente más larga tiene el modificador "^ ~", entonces no se verifican las expresiones regulares.


11
location /foo {
    deny all;
    return 404;
}

Esto le dará un 403 todo el tiempo debido a la denegación de todo ... Cuando desee que el servidor le dé un 404 solo devuelva un 404 ... así:

location /foo {
    return 404;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.