Рейтинг:2

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

флаг ci

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

Допустим, у меня на сервере Ubuntu 20.04 в качестве серверной ОС, пример.com.

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

wget -O- http://127.0.0.1:8080

Все идет нормально. Теперь то, что я хотел бы, это то, что: вместо доступа https://example.com:8080 чтобы получить доступ к этому приложению, я хотел бы получить доступ https://example.com/jaw - куда я обычно звоню /челюсть «подкаталог», но, возможно, точнее относительный URL-адрес. Другими словами, если я правильно понимаю терминологию, https://example.com/jaw перевернул бы прокси на https://example.com:8080.

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

  <Место/челюсть>
    Параметры - Мультипросмотры - Индексы
    RewriteEngine включен
    Прокси-пасс http://127.0.0.1:8080
    ПроксиПассРеверс http://127.0.0.1:8080
    SetOutputFilter прокси-html
    ПроксиHTMLURLMap http://127.0.0.1:8080
  </местоположение>
  Правило перезаписи ^/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 или подобные, которые просто хотят загрузить /статический/... -> и при вызове с адреса «порта» они будут отображаться на http://127.0.0.1:8080/статический/... и все было бы хорошо; но теперь, поскольку мы проксированы:

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

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

  Прокси-пасс /jaw/ http://127.0.0.1:6789/
  ПроксиПассРеверс /jaw/ http://127.0.0.1:6789/

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

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

  Прокси-пасс /jaw/ http://127.0.0.1:8080
  ПроксиHTMLURLMap http://127.0.0.1:8080/jaw
  <Местоположение /челюсть/>
    ПроксиПассРеверс /
    ПроксиПассРеверс http://127.0.0.1:8080
    ProxyHTMLEnable Вкл.
    ПроксиHTMLURLMap //jaw/
  </местоположение>

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

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 Proxy. Так что некоторые переделки произошли, но что-то все равно не так.

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


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

AH00898: ошибка поиска DNS для: 127.0.0.1:6789static, возвращенная /poll/static/js/html.js

... так что явно отсутствует косая черта; так получилось что это:

  Прокси-пасс /jaw/ http://127.0.0.1:8080/
  ПроксиHTMLURLMap http://127.0.0.1:8080/ /jaw/
  <Местоположение /челюсть/>
    ПроксиПассРеверс /
    ПроксиПассРеверс http://127.0.0.1:8080/
    ProxyHTMLEnable Вкл.
    ПроксиHTMLURLMap //jaw/
  </местоположение>

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

флаг in
Настройте внутренний сервер с правильным базовым URL-адресом. Это намного проще, чем принудительно перезаписывать прокси.
sdbbs avatar
флаг ci
Спасибо @GeraldSchneider - это помогло мне понять, что это приложение имеет аргумент `--url-prefix`, и в итоге это сработало для меня ...
Рейтинг:3
флаг in

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

Настройка должна быть JAWANNDENN_URL_PREFIX . Просто установите его на /челюсть и все URL-адреса должны быть сгенерированы правильно.

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

sdbbs avatar
флаг ci
Спасибо, в итоге я использовал `--url-prefix`, чтобы указать `JAWANNDENN_URL_PREFIX` для `jaw`, а затем работает только `ProxyPass/ProxyPassReverse/jaw/ http://127.0.0.1:8080/jaw/` нормально для прокси.

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.