Переписать в местоположении, в proxy_pass для обратного прокси

У меня есть файл .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/.....

Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Спасибо большое за вашу помощь!

С наилучшими пожеланиями, Луис Набаис

Вы пытаетесь передать http://www.example.com/messaging/foohttp://subdomain.local.example.com/system/console/foo?

Richard Smith 13.02.2019 18:35

Привет Ричард. Спасибо за ответ :) Да, идея именно в этом!

LuisNabais 14.02.2019 11:27
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
1
2
35
1

Ответы 1

Вы можете переписать 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.

LuisNabais 14.02.2019 12:08

Каким-то образом он перенаправляется на /, который захватывается местоположением /.

LuisNabais 14.02.2019 12:15

Другие вопросы по теме