Я пытался настроить обратный прокси-сервер, используя apache 2 mod_proxy и директивы proxypass и proxypassreverse.
Я устанавливаю WSO2 Identity Server и хочу получить доступ к этому приложению, используя URL-адрес, например следующий.
hxxp://myserver.domain.com/wso2/
В myserver.domain.com
доступен в Интернете
Внутри моей сети я настроил виртуальный хост, работающий в моей конфигурации apache2, со следующими параметрами:
По разным причинам порт 80 недоступен, и виртуальный хост должен оставаться как 8080.
Наконец, вот моя конфигурация виртуального хоста
<VirtualHost *:8080>
<Location /wso2/>
ProxyPass hxxps://internal.wso2.node:9443/
ProxyPassReverse hxxs://internal.wso2.node:9443/
</Location>
ProxyVia On
ProxyPreserveHost Off
ProxyAddHeaders Off
ProxyRequests Off
SSLProxyEngine On
SSLProxyCheckPeerCN Off
</VirtualHost>
Проблема:
Я могу использовать свой веб-браузер (Firefox / Chrome), чтобы запросить http://myserver.domain.com/wso2/ ресурс. В моих файлах журнала я вижу, что запрос попадает на сервер apache, а виртуальный хост перехватывает местоположение / wso2 /.
Он проходит через прокси и попадает на сервер internal.wso2.node. однако продукт WSO2 IS выполняет несколько перенаправлений, которые в файлах журнала я вижу, что он запрашивает ресурс с добавленным портом.
Вот поток запросов
hxxp://myserver.domain.com/wso2/ -> hxxps://internal.wso2.node:9443/
REDIRECT x3
hxxps://internal.wso2.node:8080/carbon ->
hxxps://internal.wso2.node:8080/carbon/admin/login.jsp
Back to my web browser
hxxp://myserver.domain.com:8080/wso2/carbon/admin/login.jsp
По какой-то причине ответ apache добавляет свой виртуальный хост к URL-адресу, который я запрашиваю.
Если я удалю порт: 8080 вручную и снова запрошу полный URL-адрес в браузере, он получит доступ к ресурсу в порядке. Однако любая попытка доступа с использованием только http://myserver.domain.com/wso2/ приведет к перенаправлению и добавлению порта.
Поскольку вы также меняете URI при выполнении ProxyPass, вероятно, вам нужно будет также переписать файл cookie
<VirtualHost *:8080>
ServerName myserver.domain.com
ProxyVia On
ProxyPreserveHost Off
ProxyAddHeaders Off
ProxyRequests Off
SSLProxyEngine On
SSLProxyCheckPeerCN Off
ProxyPass /wso2/ https://internal.wso2.node:9443/
ProxyPassReverse /wso2/ http://myserver.domain.com:8080/
ProxyPassReverseCookiePath / /wso2
ProxyPassReverseCookieDomain internal.wso2.node myserver.domain.com
</VirtualHost>
Обычно ProxyPassReverse немного сложен (по крайней мере, для меня), и, вероятно, вам понадобится ProxyPassReverseCookiePath
, и на всякий случай ProxyPassReverseCookieDomain
(чтобы переписать файлы cookie для поддержания сеанса).