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

30

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 correctement remarqué, il s'en est suivi un autre location ~ ...qui correspondait, de sorte que je location ~ ...n'avais aucune chance de courir.

Vlad T.
la source
Je ne vois pas pourquoi votre passe proxy regex ne fonctionne pas. Que se passe-t-il lorsque vous l'essayez?
Grincheux
Quand je l'essaye, le frontgin nginx lance une erreur 404.
Vlad T.
Est-ce que) à la fin de la déclaration d'emplacement est juste une erreur dans votre question ou est-ce aussi dans votre fichier de configuration?
Guido Vaccarella
Vous devez vérifier le reste de votre configuration pour les erreurs. De plus, vous voudrez peut-être savoir pourquoi il lance un 404 en voyant où il regarde, ce qui manquait. Il est également possible qu'il jette 404 sur le document d'erreur non trouvé et qu'il soit donc nécessaire de regarder une erreur précédente levée.
Grincheux
veuillez fournir l'erreur du journal des erreurs
Mohammad AbuShady

Réponses:

30

Selon la documentation de 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 statique :

  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 statiques / multimédias ).

Guido Vaccarella
la source
13
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.

Grincheux
la source
Oh, désolé pour un malentendu, je pensais que c'était le crochet après "media" |media)dans la chaîne a commencé par "location". Mais une mauvaise accolade ici n'est qu'une faute de frappe (corrigée en question). Sinon, cette configuration nginx ne serait pas chargée et lancerait à nouveau une erreur comme unexpected ")"...Désolé.
Vlad T.Jan