%20%D1%82%D0%BE%D0%B3%D0%BE%20%D0%B6%D0%B5%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20%D0%B2%20Apache%202.4%3F.png)
Я виделКак правильно обрабатывать относительные URL-адреса с помощью обратного прокси-сервера- однако у меня возникли большие трудности с пониманием этого (и применением этого к моей проблеме), надеюсь, кто-то сможет помочь.
Допустим, на моем сервере установлена серверная ОС Ubuntu 20.04 example.com
.
Затем я устанавливаюhttps://github.com/hartwork/jawanndennна сервере и запустите его — это приложение по умолчанию работает на порту 8080; и я могу подтвердить, что оно работает на самом сервере, выполнив:
wget -O- http://127.0.0.1:8080
Пока все хорошо. Теперь, что я хотел бы, так это: вместо access https://example.com:8080
to 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.