У меня есть два рабочих места в конфигурации 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 ~ ...
не было шанса бежать.
В соответствии с документация 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 (если он вам нужен для других файлов, которых нет в статический / СМИ).
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
) <-----------
Должно быть...
location ~ ^/(static|media)/ {
proxy_pass http://backend.example.com;
} <-----------
Закрытие должно быть фигурной скобкой {}, а не скобкой ().
Не могу поверить, сколько времени понадобилось, чтобы это увидеть. Гвидо был прав, судя по комментариям.