вторник, 4 апреля 2023 г.

Назначение префикса URI для веб сервисов

Эта история из разряда "как не нужно делать". Изначально не планировал ее писать, но потратил некоторое количество времеми и хочется предостеречь других от хождения по граблям.

Имеется набор веб сервисов в которых не реализована настройка префикса URI, т.е. все ссылки строятся относительно "корня" (например: hostname:port/login, hostname:port/public/script.js, и т.д.).

И есть желание проверить сможет ли Nginx прозрачно проксировать запросы добавляя префикс каждому сервису чтобы не пришлось менять внутренности самих сервисов.

Сразу скажу что существует более надежное и простое решение - дать каждому сервису собственный поддомен, но это бывает сложно с точки зрения процессов: одобрение доменных имён, новые записи в DNS, SSL сертификаты и т.д.

Минимально рабочая конфигурация Nginx получилась не с первого раза:

      location /services/svc/ {
        sub_filter 'public/' 'services/svc/public/';
        sub_filter_types 'text/javascript';
        sub_filter_once off;
        proxy_redirect / /services/svc/;
        proxy_pass http://svc:5000/;
      }

Что работает:

  • перезапись адреса редиректа (например /login на /services/svc/login);
  • замена ссылок в HTML и JavaScript ответах;

Что не работает (и лучше не пытаться это чинить):

  • ссылки, которые генерирует JavaScript на стороне браузера (они могут совпадать у разных сервисов, так что перезаписывать и их не сработает);

В целом идея включить sub_filter для JavaScript скриптов чревата затейливыми сюрпризами в будущем если перезаписываемый элемент окажется не ссылкой или ее частью.

 

Комментариев нет:

Отправить комментарий