Nginx: Location Regex für mehrere Pfade

30

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 in einem Ort kombinieren?

Was ich schon gemacht habe:

Ich habe diesen Vorschlag ausprobiert

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

aber es funktioniert nicht bei mir.

Wenn ich keine Backends verwende, funktioniert die folgende Konfiguration ordnungsgemäß:

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

Update (einige Zeichenketten aus dem Log)

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 richtig bemerkte, folgte es einfach einem anderen location ~ ..., das passte, so dass ich location ~ ...keine Chance hatte zu rennen.

Vlad T.
quelle
Ich verstehe nicht, warum Ihr regulärer Proxy-Pass nicht funktioniert. Was passiert, wenn Sie es versuchen?
Mürrisch
Wenn ich es versuche, wirft das Frontend Nginx 404 Fehler.
Vlad T.
Ist das) am Ende der location-Anweisung nur ein Fehler in Ihrer Frage oder ist es auch in Ihrer Konfigurationsdatei?
Guido Vaccarella
Sie sollten den Rest Ihrer Konfiguration auf Fehler überprüfen. Darüber hinaus möchten Sie möglicherweise untersuchen, warum ein 404 ausgelöst wird, indem Sie sehen, wo er sucht und was fehlt. Es ist auch möglich, dass 404 auf das Fehlerdokument geworfen wird, das nicht gefunden wurde, und daher einen früheren geworfenen Fehler untersuchen müssen.
Mürrisch
Bitte geben Sie den Fehler aus dem Fehlerprotokoll an
Mohammad AbuShady 31.12.13

Antworten:

30

Laut Nginx-Dokumentation :

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.

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

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

Leider deaktiviert die "log_not_found off" -Klausel die Protokollierung für alle nicht gefundenen Fehler in Bezug auf diesen Speicherort. Aus diesem Grund ist Ihr error_log leer!

Sie können versuchen, diesen Speicherort zu kommentieren oder ihn nach dem Speicherort mit dem proxy_pass zu verschieben (falls Sie ihn für andere Dateien benötigen, die nicht in static / media gespeichert sind ).

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

Sollte sein...

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

Das Schließen muss eine geschweifte Klammer {} sein, keine Klammer in Klammern ().

Ich kann nicht glauben, wie lange es gedauert hat, das zu sehen. Guido war richtig aus den Kommentaren.

Mürrisch
quelle
Oh, entschuldigung für das Missverständnis, ich dachte, es sei die Klammer gemeint, nachdem "media" |media)in der Zeichenfolge mit "location" begonnen hat. Aber eine falsche Klammer ist hier nur ein Tippfehler (korrigiert in Frage). Andernfalls würde diese Nginx-Konfiguration nicht geladen werden und einen Fehler wie " unexpected ")"...Sorry" auslösen.
Vlad T.