2016-02-10 1 views

Antwort

83

Versuchen

location ~ ^/(first/location|second/location)/ { 
    ... 
} 

Das ~ bedeutet einen regulären Ausdruck für die URL zu verwenden. Das^bedeutet, vom ersten Zeichen aus zu prüfen. Dies wird nach einem/gefolgt von einem der Standorte und dann einem anderen/suchen.

+11

Hinweis: Wenn diese häufig auftritt (wie Tausende), wird es eine Leistungseinbuße aufgrund Regex Matching entstehen. Auch die Reihenfolge der Übereinstimmung ist wesentlich unterschiedlich. In vielen "kleinen" Fällen verhält es sich so, wie Sie es wollen, aber das ist etwas, worauf Sie achten sollten. Ich persönlich möchte, dass Nginx "location" mehrere "=" Bedingungen unterstützt, anstatt sich auf eine Regex-Regel zu verlassen. – Bernard

+3

IMHO sollte dies effizienter sein: location ~ (patternOne | patternTwo) {...} – stamster

+1

Diese Lösung hat bei mir nicht funktioniert; aber @ stamsters Kommentar hat es getan; Ich führe 'nginx/1.13.2' –

40

Eine weitere Option besteht darin, die Regeln an zwei Präfixpositionen mithilfe einer enthaltenen Datei zu wiederholen. Da Präfixpositionen in der Konfiguration positionsunabhängig sind, kann die Verwendung dieser Präfixe zu Verwirrung führen, wenn Sie später weitere Regex-Speicherorte hinzufügen.

server { 
    location /first/location/ { 
     include shared.conf; 
    } 
    location /second/location/ { 
     include shared.conf; 
    } 
} 

Hier ist eine Probe shared.conf:

default_type text/plain; 
return 200 "http_user_agent: $http_user_agent 
remote_addr: $remote_addr 
remote_port: $remote_port 
scheme:  $scheme 
nginx_version: $nginx_version 
"; 
+0

Kannst du bitte 'shared.conf' Beispiel und Ort hinzufügen? –

+1

Ich habe eine Beispieldatei shared.conf hinzugefügt. Sie können einen absoluten Pfad zur shared.conf verwenden oder ihn in Ihr nginx-Verzeichnis einfügen. In diesem Fall enthält es nur einige Direktiven. –

7

Sowohl die regex und darin enthaltenen Dateien gute Methoden sind und ich die häufig verwenden. Eine andere Alternative besteht darin, einen benannten Ort zu verwenden, was in vielen Situationen nützlich ist - insbesondere in komplizierteren Situationen. Die Standard-"If is Evil" page zeigt im Wesentlichen nach der als eine gute Möglichkeit, Dinge zu tun:

error_page 418 = @common_location; 
location /first/location/ { 
    return 418; 
} 
location /second/location/ { 
    return 418; 
} 
location @common_location { 
    # The common configuration... 
} 
-1

Dies ist kurz, aber effiziente und bewährte Ansatz:

location ~ (patternOne|patternTwo){ #rules etc. }

man kann also leicht haben mehrere Muster mit einfachen Pipe-Syntax, die auf denselben Standortblock/dieselben Regeln verweist.

-1

Für Vererbungsfall:

location /first { 
    # do some stuff here, and than go to /base 
    try_files /base; 
} 

location /second { 
    # do some other stuff here, and than go to /base 
    try_files /base; 
} 

location /base { 
    # base stuff here 
} 
+0

Ist das gültig? [Die Dokumente] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) schlagen vor, dass mindestens eine Datei benötigt wird. Vielleicht müssen Sie etwas tun, wie 'try_files file_that_will_never_exist.yml/base;'. – Mike

Verwandte Themen