Frage wie man den Zugriff auf Verzeichnisse und Unterverzeichnisse einschränkt


Ich muss den Zugriff auf alle Dateien oder Unterverzeichnisse in direstory "testdir" beschränken. Mein Vertrauen:

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


35
2018-05-02 21:55


Ursprung


Beachten Sie, dass die Standortfunktion nach meiner Erfahrung nur ordnungsgemäß funktioniert, wenn nginx unter Linux ausgeführt wird. Wenn wir auf Windows laufen, hatten wir Probleme damit nicht zu funktionieren ... - samsmith


Antworten:


den Zugriff auf mehrere Verzeichnisse in nginx in einem Standorteintrag beschränken

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

33
2018-02-08 14:55



Sie sollten 403 und nicht 404 zurückgeben. - Stillmatic1985
Dies beantwortet die Frage überhaupt nicht. - Keelan


Das liegt daran, dass die "root" -Direktive übereinstimmt, bevor die "deny" -Richtlinie gefunden werden kann. Vertauschen Sie die Reihenfolge Ihrer Anweisungen und es sollte funktionieren:

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

19
2018-05-05 18:31





Verwenden Sie die folgenden Speicherorte, um sicherzustellen, dass die Übereinstimmung testdir anstelle der Übereinstimmung jpg / txt verwendet wird:

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

In Ihrem Beispiel haben Sie zwei Arten von Standorten. location /testdir ist ein Präfix Ort, da es keine Tilde hat (~) zwischen location und /testdir.

location ~* ^.+\.(jpg|txt)$ ist ein Regex-Ort (eine Groß-und Kleinschreibung, aufgrund der * direkt nach der Tilde). Von dem Nginx-Dokumentation:

Um den Ort zu finden, der mit einer bestimmten Anfrage übereinstimmt, prüft nginx zuerst die Orte, die mit den Präfix-Strings (Präfix-Orte) definiert wurden. Unter diesen wird der Ort mit dem längsten passenden Präfix ausgewählt und erinnert. Dann werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens in der Konfigurationsdatei überprüft. Die Suche nach regulären Ausdrücken endet bei der ersten Übereinstimmung, und die entsprechende Konfiguration wird verwendet. Wenn keine Übereinstimmung mit einem regulären Ausdruck gefunden wird, wird die Konfiguration des zuvor gespeicherten Präfixorts verwendet.

Das Problem hierbei ist, dass Ihre Testdir-Position gespeichert wird, aber dann wird die jpg / txt-Position während der Regex-Phase ausgewählt, da sie übereinstimmt. Der folgende Hinweis aus der Dokumentation basiert auf meiner Lösung (siehe oben):

Wenn der Ort mit dem längsten passenden Präfix den Modifizierer "^ ~" hat, werden reguläre Ausdrücke nicht überprüft.


13
2017-10-02 12:25





location /foo {
    deny all;
    return 404;
}

Das wird dir ständig 403 geben, weil alles ablehnen ... Wenn du willst, dass der Server dir einen 404 gibt, gib einfach nur einen 404 zurück ... so:

location /foo {
    return 404;
}

10
2017-09-01 14:32