Ich habe zwei Stellen 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 bereits getan habe:
Ich habe es versuchtdieser Vorschlag
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
}
aber bei mir funktioniert es nicht.
Auch wenn ich keine Backends verwende, funktioniert die folgende Konfiguration ordnungsgemäß:
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
Tatsächlich 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 übereinstimmte, sodass meines location ~ ...
keine Chance hatte, zu laufen.
Antwort1
EntsprechendNginx-Dokumentation:
Anschließend werden reguläre Ausdrücke in der Reihenfolge ihres Auftretens in der Konfigurationsdatei überprüft. Beim ersten Treffer wird die Suche nach regulären Ausdrücken beendet 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 unterstatisch:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
Leider deaktiviert die Klausel „log_not_found off“ die Protokollierung aller Datei-nicht-gefunden-Fehler, die sich auf diesen Speicherort beziehen. Deshalb ist Ihr Fehlerprotokoll leer!
Sie können versuchen, diesen Speicherort auszukommentieren oder ihn hinter den Speicherort mit dem Proxy-Passwort zu verschieben (wenn Sie ihn für andere Dateien benötigen, die nicht instatisch/Medien).
Antwort2
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
) <-----------
Sollte sein...
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
} <-----------
Das schließende Element muss eine Klammer {} sein, keine runde Klammer ().
Ich kann nicht glauben, wie lange es gedauert hat, bis ich das gesehen habe. Guido hatte mit seinen Kommentaren recht.