Frage Nginx: Ortsregex für mehrere Pfade mit Backend


Ich habe zwei Standorte in Nginx Config, die funktionieren:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

Wie kann ich diese beiden an einem Ort kombinieren?

Was ich schon gemacht habe:

Ich habe es versucht dieser Vorschlag

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

aber es funktioniert nicht für mich.

Wenn ich keine Backends verwende, funktioniert die folgende Konfiguration korrekt:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

AKTUALISIEREN (einige Zeichenfolgen aus dem Protokoll)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

LÖSUNG

Eigentlich funktioniert meine Lösung gut:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

und das Problem hat nichts mit Backends zu tun. Wie Guido Vaccarella es richtig bemerkte, folgte es erst nach dem anderen location ~ ... das passte, so dass mein location ~ ... hatte keine Chance zu rennen.


21
2017-12-30 09:43


Ursprung


Ich verstehe nicht, warum Ihr Regex-Proxy-Pass nicht funktioniert. Was passiert, wenn Sie es versuchen? - Grumpy
Wenn ich es versuche, löst das Frontend Nginx 404 Fehler aus. - Vlad T.
Ist das) am Ende der Location-Anweisung nur ein Fehler in deiner Frage oder liegt es auch in deiner Konfigurationsdatei? - Guido Vaccarella
Sie sollten den Rest Ihrer Konfiguration auf Fehler überprüfen. Darüber hinaus möchten Sie möglicherweise untersuchen, warum es einen 404 wirft, indem Sie sehen, wo es hinsieht, was fehlte. Es ist auch möglich, dass das Fehlerdokument 404 nicht gefunden wird und daher ein früherer Fehler angezeigt werden muss. - Grumpy
Bitte geben Sie den Fehler aus dem Fehlerprotokoll an - Mohammad AbuShady


Antworten:


Gemäß Nginx-Dokumentation:

Dann werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens überprüft   in der Konfigurationsdatei. Die Suche nach regulären Ausdrücken   endet bei der ersten Übereinstimmung, und die entsprechende Konfiguration ist   gebraucht.

In Ihrer Konfiguration ist der folgende Speicherort vor dem mit dem proxy_pass definiert und entspricht der Anforderung von js und css-Dateien unter statisch:

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

Unglücklicherweise deaktiviert die "log_not_found off" -Klausel die Protokollierung für irgendeinen Datei-nicht-gefundenen Fehler in Bezug auf diesen Ort, deshalb ist Ihr error_log leer!

Sie können versuchen, diesen Speicherort zu kommentieren oder nach dem Speicherort mit dem proxy_pass zu verschieben (wenn Sie es für andere Dateien benötigen, die nicht in statisch / Medien).


27
2018-01-04 22:50





location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Sollte sein...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

Das Closing muss eine geschweifte Klammer {} sein, keine Klammernklammer ().

Ich kann nicht glauben, wie lange es gedauert hat, das zu sehen. Guido hatte Recht von den Kommentaren.


8
2018-01-01 06:00



Oh, Entschuldigung für Missverständnisse, ich dachte, es war die Klammer nach "Medien" gemeint |media) in der Zeichenfolge begann mit dem "Standort". Aber falsche Klammer hier ist nur ein Tippfehler (in Frage korrigiert). Sonst würde diese nginx-Konfiguration nicht geladen werden und würde einen Fehler wie etwas werfen unexpected ")"... Entschuldigung, schon wieder. - Vlad T.