Nginx-Regel - Entspricht allen Pfaden außer einem

9

Ich versuche, alle Pfade, die mit / newsletter / beginnen, mit Ausnahme eines (/ newsletter / one) mit einem regulären Ausdruck abzugleichen. Was ich bisher habe:

   location ~ ^/newsletter/(.*)$ {
// configuration here
}

Dies entspricht allen Pfaden, die mit / newsletter / beginnen.

Wie mache ich eine Ausnahme für den Pfad / Newsletter / einen?

dasj19
quelle
Wenn Sie dies für Let's Encrypt googeln,
erfahren

Antworten:

12

Am Ende habe ich die folgende Lösung verwendet:

location ~ ^/newsletter/(.*)$ {
    location ~ /newsletter/one(.*) {
           // logic here
    }
    // logic here
}

Dies stimmt mit allen Pfaden unter / newsletter / * überein, und dann stimme ich mit allen Pfaden überein, die mit / newsletter / one beginnen, und wende die Konfiguration für den Newsletter / one im inneren Konfigurationsblock an, während ich den Rest der Konfiguration in der äußeren Konfiguration behalte Block.

dasj19
quelle
1
Afaik ein bisschen Texterklärung könnte viel helfen.
Peterh
8

Dies funktioniert, hat aber einen Fehler. Es stimmt auch nicht mit "Eins" überein, gefolgt von Zeichen.

location ~ ^/newsletter/(?!one).*$ {
    //configuration here
}

Dies kann jedoch besser sein:

location = /newsletter/one {
    // do something (not serve an index.html page)
}

location ~ ^/newsletter/.*$ {
    // do something else
}

Dies funktioniert, weil Nginx, wenn es eine genaue Übereinstimmung mit einem findet, =diese verwendet, locationum die Anfrage zu bedienen. Ein Problem ist, dass dies nicht übereinstimmt, wenn Sie eine indexSeite verwenden, da die Anforderung intern neu geschrieben wird und daher mit der zweiten location"besseren" übereinstimmt und diese verwendet wird. Siehe Folgendes: https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms#matching-location-blocks

In einem Abschnitt wird erläutert, wie Nginx den zu verwendenden Speicherort auswählt.

varlogtim
quelle
2

Um die Lösung von varlogtim zu verdeutlichen, würde Folgendes funktionieren, sodass Sie übereinstimmen und /newsletter/one-timetrotzdem überspringen können/newsletter/one

location ~ ^/newsletter/(?!one$).*$

Wenn Sie die Groß- und Kleinschreibung in Ihrem Spiel ignorieren möchten, verwenden Sie den ~*Modifikator anstelle von~

cbedrosian
quelle
0

Hier ist der eine:

^/newsletter(/&/[^o][^n][^e])$
Jonas Björk
quelle