web-dev-qa-db-fra.com

Nginx: expression régulière d'emplacement pour plusieurs chemins

J'ai deux emplacements dans la configuration nginx qui fonctionnent:

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

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

Comment puis-je combiner ces deux en un seul endroit?

Ce que j'ai déjà fait:

J'ai essayé cette suggestion

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

mais ça ne marche pas pour moi.

De plus, lorsque je n'utilise pas de backends, la configuration suivante fonctionne correctement:

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

mise à jour (quelques chaînes du journal)

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$

SOLUTION

En fait, ma solution fonctionne bien:

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

et la question n'a rien à voir avec les backends. Comme Guido Vaccarella l'a remarqué à juste titre, il a juste suivi un autre location ~ ... qui correspondait, de sorte que mon location ~ ... n'avait aucune chance de courir.

34
Vlad T.

Selon documentation nginx :

Les expressions régulières sont ensuite vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières se termine à la première correspondance et la configuration correspondante est utilisée.

Dans votre configuration, l'emplacement suivant est défini avant celui avec le proxy_pass et il correspond à la demande des fichiers js et css sous static :

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

Malheureusement, la clause "log_not_found off" désactive la journalisation pour toute erreur de fichier introuvable concernant cet emplacement, c'est pourquoi votre error_log est vide!

Vous pouvez essayer de commenter cet emplacement ou le déplacer après l'emplacement avec le proxy_pass (si vous en avez besoin pour d'autres fichiers qui ne sont pas dans statique / support ).

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

Devrait être...

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

La fermeture doit être une accolade {}, pas une parenthèse parenthèse ().

Je ne peux pas croire combien de temps il a fallu pour voir ça. Guido avait raison des commentaires.

16
Grumpy