it-swarm.com.de

Nginx-Platzhalter / Regex im Standortpfad

Die Nginx-Konfiguration, die ich habe, wirft 404 für .php mögen:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Ich habe jedoch eine index.php-Datei im Unterordner, die ich ausführen möchte. Die aktuelle Konfiguration lautet wie folgt:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

es funktioniert einwandfrei, aber das Problem sind doppelte Speicherorte. Wenn viele Unterseiten vorhanden sind, wird die Konfiguration sehr umfangreich.

Ich habe den Platzhalter wie * und einen regulären Ausdruck ausprobiert, der besagt, dass der Nginx-Test bestanden wurde, die Seite jedoch nicht geladen wird, d. H. 404. Was ich versucht habe, sind:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Gibt es eine Möglichkeit, einen Pfadnamen als Regex oder Wildcard am Speicherort zu haben?

25
user156477

Der Modifikator = Im Block location ist eine exakte Übereinstimmung ohne Platzhalter, Präfixübereinstimmung oder reguläre Ausdrücke. Deshalb funktioniert es nicht.

Bei Ihrem Regex-Versuch stimmt [a-z] Mit einem einzelnen Zeichen zwischen a und z überein. Deshalb funktioniert es bei Ihnen nicht.

Sie müssen Ihre Standorte wie folgt einrichten. Beachten Sie die Reihenfolge der location -Anweisungen. nginx wählt die erste übereinstimmende Regex-Bedingung aus.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Ich verwende hier die Übereinstimmung zwischen Groß- und Kleinschreibung (Modifikator ~ Anstelle von ~*). Im ersten Fall stimme ich mit dem ersten Teil des Pfads überein, dann mit einer oder mehreren alphabetischen Zeichen und dann mit index.php. Sie können den Übereinstimmungsbereich ändern, aber beachten Sie den + Für "eine oder mehrere" Wiederholungen.

Der zweite entspricht einem URI, der mit .php Endet. Sie benötigen die zusätzlichen Zeichen in Ihrer Version nicht, da reguläre Ausdrücke funktionieren.

32
Tero Kilkanen

Die Reihenfolge ist wichtig, von Beschreibung des "Standorts" von nginx :

Um einen Standort zu finden, der einer bestimmten Anforderung entspricht, überprüft nginx zunächst Standorte, die mithilfe der Präfixzeichenfolgen (Präfixpositionen) definiert wurden. Unter diesen wird der Ort mit dem längsten übereinstimmenden Präfix ausgewählt und gespeichert. Anschließend werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens in der Konfigurationsdatei überprüft. Die Suche nach regulären Ausdrücken endet mit 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.

Es bedeutet:

  • Zuerst =. (Übereinstimmung "längstes übereinstimmendes Präfix")
  • Dann implizite. (Übereinstimmung "längstes übereinstimmendes Präfix")
  • Dann Regex. (erstes Spiel)

Sie müssen die Reihenfolge der Regex-Teile anpassen.

1
Gea-Suan Lin