it-swarm.com.de

Nginx: Standort-Regex für mehrere Pfade

Ich habe zwei Speicherorte in der Nginx-Konfiguration, 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 versucht dieser Vorschlag

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 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 richtig bemerkte, folgte es nur nach einem anderen location ~ ... das stimmte überein, so dass mein location ~ ... hatte keine Chance zu rennen.

34
Vlad T.

Laut Nginx-Dokumentation :

Anschließend werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens in der Konfigurationsdatei überprüft. Die Suche nach regulären Ausdrücken endet mit der ersten Übereinstimmung und die entsprechende Konfiguration wird 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 Klausel "log_not_found off" die Protokollierung für alle nicht gefundenen Fehler in Bezug auf diesen Speicherort. Deshalb ist Ihr error_log leer!

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

35
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 Klammer {} sein, keine Klammer ().

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

16
Grumpy