Nginx: регулярное выражение местоположения для нескольких путей

Nginx: регулярное выражение местоположения для нескольких путей

У меня есть два места в конфигурации nginx, которые работают:

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

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

Как мне объединить эти два места в одном?

Что я уже сделал:

Я пыталсяэто предложение

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

но у меня это не работает.

Кроме того, когда я не использую бэкэнды, следующая конфигурация работает правильно:

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

обновлять(некоторые строки из журнала)

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$

РЕШЕНИЕ

На самом деле мое решение работает отлично:

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

и проблема не имеет никакого отношения к бэкэндам. Как правильно заметил Гвидо Ваккарелла, он просто следовал за другим, location ~ ...который соответствовал, так что у моего location ~ ...не было шанса запуститься.

решение1

В соответствии сдокументация nginx:

Затем проверяются регулярные выражения в порядке их появления в конфигурационном файле. Поиск регулярных выражений прекращается при первом совпадении, и используется соответствующая конфигурация.

В вашей конфигурации следующее местоположение определено перед местоположением с proxy_pass и соответствует запросу файлов js и css встатический:

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

К сожалению, пункт «log_not_found off» отключает ведение журнала для любой ошибки «файл не найден», связанной с этим местоположением, поэтому ваш error_log пуст!

Вы можете попробовать закомментировать это место или переместить его после места с proxy_pass (если оно вам нужно для других файлов, отсутствующих встатический/СМИ).

решение2

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

Должно быть...

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

Закрытие должно быть фигурной скобкой {}, а не круглой скобкой ().

Не могу поверить, сколько времени потребовалось, чтобы это увидеть. Гвидо был прав, судя по комментариям.

Связанный контент