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.