У меня есть файл .conf на обратном прокси-сервере NGINX. Я получаю URL-адрес запроса, например: http://www.example.com/сообщения
И мне нужно заставить его преобразовать /messaging в /system/console, в контейнер karaf. Вроде просто, но это не так, объясню лучше почему.
Контейнер находится в другом субдомене, например http://subdomain.local.example.com/system/console
Единственный способ заставить его работать, он не загружает статические файлы (изображения, js, css), только html, был таким:
location /messaging {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /messaging/(.*) /$1 last;
proxy_pass http://subdomain.local.example.com/system/console/;
}
Таким образом, изображения запрашиваются по адресу http://subdomain.local.example.com/system/console/res/flags/en.gif. вместо обмена сообщениями/система/консоль/res/flags/en.gif.
Вот мой полный конфигурационный файл (к сожалению, здесь неправильный отступ, я могу заверить, что он правильный в конфигурационном файле):
upstream app-web-dev-lb {
server app-web-dev-01:8080;
server app-web-dev-02:8080;
}
server {
listen 80;
server_name app-dev.example.com;
client_max_body_size 50M;
location /my-services {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
proxy_pass http://app-cm-dev.local.example.com/my-services;
}
location /app-messaging {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
#rewrite /app-messaging/(.*) /system/console/$1 break;
#rewrite /system/console/(.*) /app-messaging/$1 break;
#rewrite /app-messaging/(.*) /$1 last;
rewrite /app-messaging/(.*) /$1 break;
#rewrite /system/console/res/(.*) /app-messaging/res/$1 last;
#rewrite /app-messaging/res/(.*) /system/console/res/$1 last;
#rewrite /app-web(.*) /$1 last;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header Host $http_host;
#proxy_set_header Host $host;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://servicemix-dev.local.example.com/system/console;
#proxy_pass http://servicemix-dev.local.example.com/system/console/bundles;
proxy_pass http://servicemix-dev.local.example.com\;
#proxy_redirect /system/console /app-messaging/system/console;
#proxy_redirect default;
#proxy_redirect off;
#proxy_set_header Host $host;
}
location / {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /app-web(.*) /$1 last;
proxy_pass http://app-web-dev-lb/app-web/;
}
location /app-web {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /app-web(.*) /$1 last;
proxy_pass http://app-web-dev-lb/app-web/;
}
}
И последнее замечание: я не хочу перенаправлять /обмен сообщениями на /, потому что у меня есть адрес по умолчанию /, который уже перенаправляет на другой путь. Поэтому я не хочу добавлять местоположение /system, так как у меня будет больше контейнеров Kafka. Я хотел бы понять, почему не все запросы распознаются в папке /messaging, почему некоторые перенаправляются в /system/console/.....
Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Спасибо большое за вашу помощь!
С наилучшими пожеланиями, Луис Набаис
Привет Ричард. Спасибо за ответ :) Да, идея именно в этом!

Вы можете переписать URI с /messaging/foo на /system/console/foo, поскольку он проходит вверх по течению двумя способами.
Первый метод использует директивы location и proxy_pass для выполнения перевода. Например:
location /messaging {
expires -1;
add_header ...;
proxy_pass http://subdomain.local.example.com/system/console;
}
Оба URI в операторах location и proxy_pass должны иметь завершающий / или не иметь завершающего /. Подробнее см. в этот документ.
Во втором методе используется rewrite...break. Например:
location /messaging {
expires -1;
add_header ...;
rewrite /messaging(/.*)?$ /system/console$1 break;
proxy_pass http://subdomain.local.example.com;
}
Вы должны использовать break, поскольку переписанный URI должен обрабатываться в том же блоке location. Подробнее см. этот документ.
Я именно так и думал. Но в обоих случаях URL-адрес каким-то образом перезаписывается, а часть /messaging игнорируется, поэтому статические файлы не открываются правильно, они открываются так: example.com/system/console/res/flags/en.gif вместо example.com/messaging/system/console/res/flags/en.gif.
Каким-то образом он перенаправляется на /, который захватывается местоположением /.
Вы пытаетесь передать
http://www.example.com/messaging/foohttp://subdomain.local.example.com/system/console/foo?