43 votes

Nginx : emplacement regex pour plusieurs chemins

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

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

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

Comment puis-je regrouper ces deux en un seul emplacement ?

Ce que j'ai déjà fait :

J'ai essayé cette suggestion

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

mais ça ne fonctionne pas pour moi.

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

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

mise à jour (quelques chaînes du journal)

xx.xx.xx.xx - - [31/Déc/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/Déc/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/Déc/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/Déc/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/Déc/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/Déc/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/Déc/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 :

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

et le problème n'a rien à voir avec les backends. Comme Guido Vaccarella l'a correctement noté, cela venait juste après un autre emplacement ~ ... qui correspondait, de sorte que mon emplacement ~ ... n'avait aucune chance de s'exécuter.

41voto

Gary LaRose Points 1

According to la documentation de nginx :

Ensuite, les expressions régulières sont vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières se termine sur le premier correspondant, 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 aux requêtes de 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 l'enregistrement des erreurs de fichiers non trouvés liées à cet emplacement, c'est pourquoi votre error_log est vide !

Vous pouvez essayer de commenter cet emplacement ou de 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 static / media).

20voto

amos Points 191
Emplacement ~ ^/(statique|média)/ {
  proxy_pass http://backend.example.com;
}     <-----------

Devrait être...

Emplacement ~ ^/(statique|média)/ {
  proxy_pass http://backend.example.com;
}     <-----------

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

Je ne peux pas croire combien de temps il m'a fallu pour voir ça. Guido avait raison dans les commentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X