jak ograniczyć dostęp do katalogu i podkatalogów

42

Muszę ograniczyć dostęp do jakichkolwiek plików lub podkatalogów w katalogu testdir. Mój conf:

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

W mojej konfiguracji nie mam żadnych ograniczeń dotyczących plików / testdir / jpg_or_txt. Jak to zrobić?


źródło
Uwaga: z mojego doświadczenia wynika, że ​​funkcja lokalizacji działa poprawnie tylko podczas uruchamiania nginx na Linuksie. Podczas pracy w
systemie

Odpowiedzi:

43

ograniczyć dostęp do wielu katalogów w nginx w jednym wpisie lokalizacji

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...
DavidR.
źródło
7
Powinieneś zwrócić 403, a nie 404.
Stillmatic1985
12
To wcale nie odpowiada na pytanie.
1
zwracanie 403 daje wskazówkę, że folder istnieje, 404 nie daje żadnego dowodu na istnienie folderu
Don Wilson
23

Jest tak, ponieważ dyrektywa „root” jest zgodna, zanim można dopasować dyrektywę „deny”. Odwróć kolejność swoich dyrektyw i powinno działać:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...
Guillaume Filion
źródło
16

Aby upewnić się, że zostanie wybrane dopasowanie testdir zamiast dopasowania jpg / txt, użyj następujących lokalizacji:

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

W twoim przykładzie masz dwa rodzaje lokalizacji. location /testdirjest lokalizacją prefiksu, ponieważ nie ma znaku tyldy ( ~) pomiędzy locationi /testdir.

location ~* ^.+\.(jpg|txt)$jest lokalizacją wyrażenia regularnego (bez rozróżniania wielkości liter, ze względu na *bezpośrednio za tyldą). Z dokumentacji nginx :

Aby znaleźć lokalizację pasującą do danego żądania, nginx najpierw sprawdza lokalizacje zdefiniowane za pomocą ciągów prefiksów (lokalizacje prefiksów). Spośród nich wybrano i zapamiętano lokalizację z najdłuższym pasującym prefiksem. Następnie sprawdzane są wyrażenia regularne w kolejności ich pojawienia się w pliku konfiguracyjnym. Wyszukiwanie wyrażeń regularnych kończy się przy pierwszym dopasowaniu i używana jest odpowiednia konfiguracja. Jeśli nie zostanie znalezione dopasowanie do wyrażenia regularnego, zostanie użyta konfiguracja zapamiętanej wcześniej lokalizacji prefiksu.

Problem polega na tym, że twoja lokalizacja testdir jest zapamiętywana, ale następnie lokalizacja jpg / txt jest wybierana podczas etapu wyrażenia regularnego, gdy jest dopasowana. Poniższa uwaga z dokumentacji jest tym, na czym oparłem swoje rozwiązanie (podane powyżej):

Jeśli najdłużej pasująca lokalizacja prefiksu ma modyfikator „^ ~”, wówczas wyrażenia regularne nie są sprawdzane.

Przywróć Monikę 2331977
źródło
11
location /foo {
    deny all;
    return 404;
}

To da ci 403 przez cały czas z powodu odmowy wszystkim ... Jeśli chcesz, aby serwer dał ci 404, po prostu zwróć 404 ... tak:

location /foo {
    return 404;
}
RemyNL
źródło