Я пытаюсь заставить обратный прокси-сервер apache 2.4 (RHEL 7.7) работать с приложением, у которого есть жестко закодированные пути, что делает мою конфигурацию обратного прокси-сервера довольно сложной. Эта ссылка на ошибку сервера (Как правильно обрабатывать относительные URL-адреса с помощью обратного прокси) был отличным, особенно подход к решению № 3 по размещению кучи мест (которые были жестко запрограммированы). Мой прокси-сервер использует пути для различения приложений (www.example.com/app1 и www.example.com/app2). В этом примере / app2 жестко запрограммировал несколько каталогов, таких как / static и / api. Размещение этих местоположений с помощью ProxyPass и ProxyPassReverse отлично сработало, и сайт работает.
Однако они также жестко закодированы / # / по какой-то причине, и я вижу их в href-ссылках в определенных местах. Итак, я последовал шаблону и определил Location для / # /. Однако это не работает. По какой-то причине, когда я нажимаю эту ссылку, она не направляет ее на сервер app2.internal.example.com, а вместо этого обслуживает мою домашнюю страницу, которая отвечает по адресу www.example.com/. Я вижу, что в URL-адресе отображается www.example.com/#/SOMEWHERE, но он явно не попадает в app2. Файл конфигурации находится ниже. / # / - это особое место, которое нельзя использовать? Есть ли какие-то решения для этого? Заранее спасибо.
<Location /app2/>
ProxyPass https://app2.internal.example.com/
ProxyPassReverse https://app2.internal.example.com/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /static/>
ProxyPass https://app2.internal.example.com/static/
ProxyPassReverse https://app2.internal.example.com/static/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /api/>
ProxyPass https://app2.internal.example.com/api/
ProxyPassReverse https://app2.internal.example.com/api/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
<Location /#/>
ProxyPass https://app2.internal.example.com/#/
ProxyPassReverse https://app2.internal.example.com/#/
Header add referer "https://app2.internal.example.com/"
RequestHeader set referer "https://app2.internal.example.com/"
</Location>
В #
в URL-адресе определяет фрагмент URL-адреса, часть URL-адреса, указывающую место в документе, к которому браузер будет прокручивать после загрузки документа.
Некоторые библиотеки JavaScript злоупотребляли фрагментом URL-адреса для передачи информации на стороне клиента для поддержки различных функций одностраничных приложений. Это уже не в моде (и никогда не было очень хорошей идеей), и такие приложения необходимо обновить, чтобы использовать History API и изменить эти URL-адреса соответствующим образом, чтобы больше не использовать фрагменты. Ваши разработчики должны сделать это несколько лет назад.
Есть несколько причин, по которым это было плохой идеей для начала, но, что наиболее важно для вашей ситуации, фрагмент URL-адреса является строго клиентской стороной и никогда не передается на сервер. Если у вас есть URL http://www.example.com/#/
, путь /
, и это все, что видит сервер. Он никогда не видит #/
так как это только на стороне клиента. В простом HTTP нет способа отправить его на сервер, поэтому вы не можете сопоставить его в Location
. Или что-нибудь еще.