Nginx: regex di posizione per più percorsi


30

Ho due posizioni nella configurazione di nginx che funzionano:

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

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

Come posso combinare questi due in una posizione?

Quello che ho già fatto:

Ho provato questo suggerimento

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

ma non funziona per me.

Inoltre, quando non utilizzo i backend, la seguente configurazione funziona correttamente:

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

aggiornamento (alcune stringhe dal registro)

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$

SOLUZIONE

In realtà la mia soluzione funziona benissimo:

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

e il problema non ha nulla a che fare con i backend. Come Guido Vaccarella notò correttamente, ne seguì solo un altro location ~ ...che corrispondeva, in modo che il mio location ~ ...non avesse alcuna possibilità di correre.


Non vedo perché il tuo pass per proxy regex non funziona. Cosa succede quando lo provi?
Grumpy,

Quando lo provo, il front-end nginx genera un errore 404.
Vlad T.

Il) alla fine dell'istruzione location è solo un errore nella tua domanda o è anche nel tuo file di configurazione?
Guido Vaccarella,

Dovresti ricontrollare il resto della tua configurazione per errori. Inoltre, potresti voler indagare sul perché sta lanciando un 404 vedendo dove sta guardando, cosa mancava. È anche possibile che generi 404 sul documento di errore che non viene trovato e quindi è necessario esaminare un errore precedente generato.
Grumpy,

si prega di fornire l'errore dal registro degli errori
Mohammad AbuShady

Risposte:


30

Secondo la documentazione nginx :

Quindi vengono controllate le espressioni regolari, nell'ordine del loro aspetto nel file di configurazione. La ricerca di espressioni regolari termina alla prima corrispondenza e viene utilizzata la configurazione corrispondente.

Nella tua configurazione, il seguente percorso è definito prima di quello con proxy_pass e corrisponde alla richiesta di file js e css in statico :

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

Sfortunatamente la clausola "log_not_found off" disabilita la registrazione per qualsiasi errore di file non trovato relativo a questa posizione, ecco perché il tuo error_log è vuoto!

Puoi provare a commentare questa posizione o spostarla dopo la posizione con proxy_pass (se necessario per altri file non in statico / multimediale ).


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

Dovrebbe essere...

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

La chiusura deve essere una parentesi graffa {}, non una parentesi ().

Non riesco a credere quanto tempo ci è voluto per vederlo. Guido aveva ragione dai commenti.


Oh, scusa per l'incomprensione, ho pensato che fosse la parentesi dopo "media" |media)nella stringa iniziata con la "posizione". Ma una parentesi errata qui è solo un refuso (corretto in questione). Altrimenti questa configurazione di nginx non verrebbe caricata e genererebbe un errore simile a unexpected ")"...Sorry, di nuovo.
Vlad T.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.