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 ~ ...не було шансів бігти.


Я не розумію, чому пропуск проксі-сервера не працює. Що відбувається, коли ви спробуєте це?
Бурхливий

Коли я спробую це, frontend nginx видає помилку 404.
Влад Т.

Чи є) в кінці заяви про місцеположення лише помилка у вашому запитанні чи це також у вашому файлі конфігурації?
Гвідо Ваккарела

Ви повинні двічі перевірити решту конфігурації на наявність помилок. Додатково, можливо, захочеться дослідити, чому він кидає 404, побачивши, де він шукає, чого не вистачає. Можливо також, що він кидає 404 на документ про помилку, який не знайдено, і, таким чином, потрібно переглянути попередню помилку, яку викинули.
Бурхливий

вкажіть, будь ласка, помилку з журналу помилок
Мохаммед АбуШаді

Відповіді:


30

Відповідно до документації nginx :

Потім перевіряються регулярні вирази в порядку їх появи у файлі конфігурації. Пошук регулярних виразів закінчується в першій відповідності, і використовується відповідна конфігурація.

У вашій конфігурації таке розташування визначається перед тим, що має проксі-пропуск, і воно відповідає запиту файлів js та css у статичному режимі :

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

На жаль, стаття "log_not_found off" вимикає реєстрацію будь-якої помилки, що не знайдена у файлі, пов’язаної з цим розташуванням, тому ваш файл error_log порожній!

Ви можете спробувати прокоментувати це місце або перемістити його після розташування за допомогою proxy_pass (якщо він потрібен для інших файлів, які не є статичними / медіа ).


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

Має бути...

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

Закриття повинно бути дужкою {}, а не дужкою ().

Не можу повірити, скільки часу це знадобилося. Гуйдо мав рацію від коментарів.


О, вибачте за нерозуміння, я подумав, що це мається на увазі дужка після того, як "медіа" |media)в рядку почалося з "місця". Але неправильна дужка тут - це просто помилка (виправлена ​​у питанні). В іншому випадку ця nginx-конфігурація не буде завантажена і знову видасть помилку, на кшталт unexpected ")"...Вибачте.
Влад Т.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.