wie man den Zugriff auf Verzeichnisse und Unterverzeichnisse einschränkt


42

Ich muss den Zugriff auf alle Dateien oder Unterverzeichnisse im Verzeichnis "testdir" einschränken. Meine conf:

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

In meiner Konfiguration habe ich keine Einschränkungen für / testdir / jpg_or_txt-Dateien. Wie es geht?


Beachten Sie, dass die Ortungsfunktion meiner Erfahrung nach nur dann ordnungsgemäß funktioniert, wenn nginx unter Linux ausgeführt wird. Unter Windows hatten wir Probleme damit, dass es nicht funktioniert ...
samsmith

Antworten:


43

Um den Zugriff auf mehrere Verzeichnisse in nginx an einem Ortseintrag einzuschränken, gehen Sie wie folgt vor

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

7
Sie sollten 403 und nicht 404 zurückgeben.
Stillmatic1985

12
Dies beantwortet die Frage überhaupt nicht.

1
Zurückgeben von 403 gibt einen Hinweis darauf, dass der Ordner vorhanden ist, 404 gibt keinen Hinweis darauf, dass der Ordner überhaupt vorhanden ist
Don Wilson

23

Dies liegt daran, dass die Direktive "root" übereinstimmt, bevor die Direktive "deny" abgeglichen werden kann. Kehren Sie die Reihenfolge Ihrer Anweisungen um und es sollte funktionieren:

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

16

Verwenden Sie die folgenden Speicherorte, um sicherzustellen, dass die testdir-Übereinstimmung anstelle der jpg / txt-Übereinstimmung ausgewählt ist:

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

In Ihrem Beispiel gibt es zwei Arten von Standorten. location /testdirist ein Präfix, da es keine tilde ( ~) zwischen locationund gibt /testdir.

location ~* ^.+\.(jpg|txt)$ist ein Regex-Ort (ein Ort, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, da *direkt nach der Tilde). Aus der Nginx-Dokumentation :

Um einen Ort zu finden, der mit einer bestimmten Anfrage übereinstimmt, überprüft nginx zuerst Orte, die mit den Präfix-Zeichenfolgen (Präfix-Orten) definiert wurden. Unter diesen wird der Ort mit dem längsten übereinstimmenden Präfix ausgewählt und gespeichert. Dann werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens in der Konfigurationsdatei überprüft. Die Suche nach regulären Ausdrücken wird beim ersten Treffer abgebrochen und die entsprechende Konfiguration verwendet. Wird keine Übereinstimmung mit einem regulären Ausdruck gefunden, wird die Konfiguration des zuvor gespeicherten Präfix-Speicherorts verwendet.

Das Problem hierbei ist, dass Ihr testdir-Speicherort gespeichert wird, der jpg / txt-Speicherort jedoch während der Regex-Phase entsprechend ausgewählt wird. Der folgende Hinweis aus der Dokumentation ist das, worauf ich meine (oben angegebene) Lösung gestützt habe:

Wenn die am längsten übereinstimmende Präfixposition den Modifikator "^ ~" aufweist, werden reguläre Ausdrücke nicht überprüft.


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

Dies gibt Ihnen die ganze Zeit eine 403, da alle verweigert werden ... Wenn Sie möchten, dass der Server Ihnen eine 404 gibt, geben Sie einfach nur eine 404 zurück ... wie folgt:

location /foo {
    return 404;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.