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

30

У меня есть два места в конфигурации 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 ~ ...не было шансов бежать.

Влад Т.
источник
Я не понимаю, почему ваш пропуск через regex proxy не работает. Что происходит, когда вы пытаетесь это сделать?
сварливый
Когда я пытаюсь это сделать, интерфейс nginx выдает ошибку 404.
Влад Т.
Является ли) в конце оператора местоположения просто ошибкой в ​​вашем вопросе, или это также в вашем файле конфигурации?
Гвидо Ваккарелла
Вы должны дважды проверить остальную часть вашего конфига на наличие ошибок. Кроме того, возможно, стоит выяснить, почему он выбрасывает 404, посмотрев, куда он смотрит, чего не хватает. Также возможно, что он выдает 404 в документе об ошибке, который не был найден, и, следовательно, нужно посмотреть на ранее выданную ошибку.
сварливый
пожалуйста, предоставьте ошибку из журнала ошибок
Мохаммад АбуШади

Ответы:

30

Согласно документации nginx :

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

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

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

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

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

Гидо Ваккарелла
источник
13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

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

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

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

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

Сердитый
источник
Ой, извините за недоразумение, я думал, что это означало, что скобка после "media" |media)в строке начиналась с "location". Но неправильная скобка здесь - просто опечатка (исправлено в вопросе). В противном случае этот конфиг nginx не будет загружен и снова выдаст ошибку типа unexpected ")"...Извините.
Влад Т.