Прокси передаёт приложению и путь страницы. Здесь — как одна косая черта в proxy_pass меняет этот путь.
location /api/ ловит пути, которые начинаются с /api/. Если в proxy_pass после порта ничего нет, приложение получает путь как есть. Если после порта стоит путь — хотя бы /, — nginx заменяет им совпавшее начало /api/:
proxy_pass в location /api/ |
Запрос /api/items придёт как |
|---|---|
http://127.0.0.1:8002 |
/api/items |
http://127.0.0.1:8002/ |
/items |
Когда пути подходят несколько location, nginx берёт тот, чьё начало длиннее: /api/items уйдёт в location /api/, а не в location /.
В location /api/ стоит proxy_pass http://127.0.0.1:8002/;. С каким путём придёт в приложение запрос /api/orders/7?
-
Так было бы без пути после порта. Здесь после порта
/, и nginx заменил им совпавшее начало/api/. -
/вproxy_passзаменяет совпавшее начало, а не весь путь: хвостorders/7сохраняется. -
Заменяется только совпавшее с
locationначало/api/; хвостorders/7идёт как есть.
После порта в proxy_pass стоит путь /, и nginx ставит его на место совпавшего с location начала /api/. Хвост orders/7 идёт как есть — приложение получает /orders/7.
Склад запустил своё приложение lab-stock на 127.0.0.1:8002. Его адреса начинаются с /items: /items — список товаров, /items/<номер> — один товар. Магазин хочет отдавать их под своим именем с префиксом /api/, а остальные адреса сайта оставить своему приложению. Оба приложения печатают путь, который получили, — по ответу видно, что дошло до каждого. Готово, когда склад получает адреса без префикса, а магазин — все остальные.
Отдай /api/ складу
Сделай так, чтобы запросы http://shop.lab.test/api/items… приходили в приложение склада lab-stock как /items…, а остальные адреса сайта по-прежнему шли в магазин. Сайт — /etc/nginx/sites-available/shop.
Цели · 0 из 2
- Отдать адреса /api/ приложению склада ещё не выполнена
- Оставить остальные адреса магазину ещё не выполнена