Проксирование приложения «порт» на относительном URL-адресе («подкаталоге») того же сервера в Apache 2.4?

Проксирование приложения «порт» на относительном URL-адресе («подкаталоге») того же сервера в Apache 2.4?

Я виделКак правильно обрабатывать относительные URL-адреса с помощью обратного прокси-сервера- однако у меня возникли большие трудности с пониманием этого (и применением этого к моей проблеме), надеюсь, кто-то сможет помочь.

Допустим, на моем сервере установлена ​​серверная ОС Ubuntu 20.04 example.com.

Затем я устанавливаюhttps://github.com/hartwork/jawanndennна сервере и запустите его — это приложение по умолчанию работает на порту 8080; и я могу подтвердить, что оно работает на самом сервере, выполнив:

wget -O- http://127.0.0.1:8080

Пока все хорошо. Теперь, что я хотел бы, так это: вместо access https://example.com:8080to access this application, я хотел бы like to access https://example.com/jaw- где я обычно называю /jaw"подкаталог", но, возможно, точнее будет относительный URL. Другими словами, если я правильно понимаю терминологию, https://example.com/jawя бы вернул proxy в https://example.com:8080.

Итак, я попробовал сделать это в рамках <VirtualHost *:443>определения в моем .confфайле:

  <Location /jaw>
    Options -Multiviews -Indexes
    RewriteEngine On
    ProxyPass         http://127.0.0.1:8080
    ProxyPassReverse  http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Location>
  RewriteRule ^/jaw$ /jaw/ [R]

Это работает — в том смысле, что стартовая страница приложения загружается, но целая куча ресурсов (.css, .js) не может быть загружена; открыв консоль в браузере, я вижу кучу запросов 404 для:

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

Итак, я предполагаю, что есть некоторые файлы .js или что-то подобное, которые просто хотят загрузить /static/...-> и если их вызвать с адреса «порта», они будут сопоставлены, http://127.0.0.1:8080/static/...и все будет хорошо; но теперь, поскольку мы проксированы:

  • запросы браузераhttps://example.com/jaw
  • Apache получает его, пересылает его в https://example.com:8080, где приложение слушает
  • Приложение отправляет обратно файлы (.js), которые имеют ссылки в виде/static/...
  • После того, как они возвращаются в браузер, они интерпретируются как https://example.com/static/...- перед тем, как быть использованными в качестве запросов для сервера, который затем не может их найти

Я также попытался избавиться от всего <Location>фрагмента выше и использовать в <VirtualHost *:443>узле только это:

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

Происходит то же самое, что и раньше — загружается первая страница, все остальные ресурсы, по-видимому, ссылаются на нее, /static/...и все они выдают ошибку 404.

Наконец, я избавился и от приведенных выше утверждений и использовал это:

  ProxyPass /jaw/  http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080  /jaw
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

Это имеет точно такое же поведение — первая страница загружается, ресурсы не доступны — за исключением того, что ресурсы теперь отображаются в консоли браузера как:

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

... и они терпят неудачу с ошибкой прокси 502. Так что некоторые изменения были сделаны, но что-то все равно не так.

Итак, мой вопрос - как я могу сказать Apache, прокси-серверувсеиз приложения на 127.0.0.1:8080, во что-то, что отображается как «подкаталог» (относительный URL? здесь /jaw)?


Редактировать: оказывается, ошибка прокси-сервера 502 возникла из-за:

AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js

... так что очевидно, что не хватает косой черты; поэтому в итоге получилось так:

  ProxyPass /jaw/  http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/  /jaw/
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

... на самом деле работает - по большей части ( /staticресурсы); но затем, есть вызов, /dataкоторый не обрабатывается этим ... Так что это все еще открытый вопрос (для меня) как прокси "все"

решение1

Настройте свой бэкэнд-сервер с правильным базовым url. Это намного проще, чем принудительно перезаписывать на прокси.

Параметр должен быть JAWANNDENN_URL_PREFIX. Просто установите его на , /jawи все URL-адреса будут сгенерированы правильно.

Ваш первый пример должен работать даже без ProxyHTMLURLMap и OutputFilter.

Связанный контент