Nginx-Platzhalter / Regex im Standortpfad

22

Die Nginx-Konfiguration, für die ich 404 ausgelöst habe, sieht folgendermaßen aus .php:

## 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 ist 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 perfekt, aber das Problem sind doppelte Speicherorte und wenn es viele Unterseiten gibt, wird die Konfiguration riesig.

Ich habe den Platzhalter * und etwas Regex ausprobiert, der besagt, dass der Nginx-Test bestanden wurde, aber die Seite nicht geladen wurde, z. B. 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 im Speicherort zu haben?


quelle

Antworten:

32

Der =Modifikator im locationBlock ist eine exakte Übereinstimmung ohne Platzhalter, Präfixabgleich oder reguläre Ausdrücke. Deshalb funktioniert es nicht.

Stimmt bei Ihrem regulären Ausdrucksversuch [a-z]mit einem einzelnen Zeichen zwischen aund überein z. Deshalb funktioniert es bei Ihnen nicht.

Sie müssen Ihre Standorte wie folgt einrichten. Beachten Sie die Reihenfolge der locationAnweisungen. nginx wählt die erste passende Regexbedingung aus.

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

location ~ \.php$ {
    return 404;
}

Ich benutze hier case sensitive matching ( ~Modifikator statt ~*). Im ersten Fall stimme ich mit dem ersten Teil des Pfads überein, dann mit einer oder mehreren alphabetischen / numerischen Zeichen und dann index.php. Sie können den Übereinstimmungsbereich ändern, aber die +für "eine oder mehrere" Wiederholungen nicht vergessen .

Der zweite stimmt mit jedem URI überein, der mit endet .php. Sie brauchen keine zusätzlichen Zeichen in Ihrer Version, da reguläre Ausdrücke funktionieren.

Tero Kilkanen
quelle
danke, ja die hauptsachenwiederholung fehlte im regex. +behoben.
1

Reihenfolge ist wichtig, aus der Beschreibung von nginx "location" :

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. Wenn keine Übereinstimmung mit einem regulären Ausdruck gefunden wird, wird die Konfiguration des zuvor gespeicherten Präfix-Speicherorts verwendet.

Es bedeutet:

  • Erstens =. ("Übereinstimmung mit dem längsten übereinstimmenden Präfix")
  • Dann implizite. ("Übereinstimmung mit dem längsten übereinstimmenden Präfix")
  • Dann regex. (erstes Spiel)

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

Gea-Suan Lin
quelle