Nginx: expresión regular de ubicación para múltiples rutas

Nginx: expresión regular de ubicación para múltiples rutas

Tengo dos ubicaciones en la configuración de nginx que funcionan:

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

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

¿Cómo puedo combinar estos dos en una sola ubicación?

Lo que ya he hecho:

Lo intentéesta sugerencia

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

pero no me funciona.

Además, cuando no uso backends, la siguiente configuración funciona correctamente:

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

actualizar(algunas cadenas del 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$

SOLUCIÓN

En realidad mi solución funciona bien:

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

y el problema no tiene nada que ver con los backends. Como Guido Vaccarella notó correctamente, simplemente siguió a otro location ~ ...que coincidía, por lo que location ~ ...no tuve oportunidad de correr.

Respuesta1

De acuerdo adocumentación nginx:

Luego se verifican las expresiones regulares, en el orden de aparición en el archivo de configuración. La búsqueda de expresiones regulares finaliza con la primera coincidencia y se utiliza la configuración correspondiente.

En su configuración, la siguiente ubicación se define antes de la que tiene proxy_pass y coincide con la solicitud de los archivos js y css enestático:

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

Desafortunadamente, la cláusula "log_not_found off" desactiva el registro de cualquier error de archivo no encontrado relacionado con esta ubicación, ¡es por eso que su error_log está vacío!

Puede intentar comentar esta ubicación o moverla después de la ubicación con proxy_pass (si lo necesita para otros archivos que no están enestático/medios de comunicación).

Respuesta2

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

Debiera ser...

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

El cierre debe ser una llave {}, no un paréntesis ().

No puedo creer cuánto tiempo tomó ver eso. Guido tenía razón en los comentarios.

información relacionada