Estou implantando o Apache na frente de um aplicativo hospedado pelo Karaf (o Apache e o Karaf estão em servidores separados). Quero que o Apache opere como proxy reverso e também oculte parte da URL.
O URL para obter a página de logon do aplicativo diretamente do servidor de aplicativos é http://app-server:8181/jellyfish
. As páginas são atendidas pela instância do Jetty em execução no Karaf. Obviamente, esse comportamento geralmente seria bloqueado pelo firewall para tudo, exceto o servidor proxy reverso.
Com o firewall desativado, se você clicar nesse URL, o Jetty carregará a página de login. A barra de endereços do navegador muda corretamente para http://app-server:8181/jellyfish/login?0
e tudo funciona.
O que eu quero é que http://web-server
(da raiz) seja mapeado para o Jetty no servidor de aplicativos com o nome do aplicativo ( jellyfish
) suprimido. por exemplo, o navegador mudaria para ser exibido http://web-server/login?0
na barra de endereços e todos os URLs e conteúdos subseqüentes seriam veiculados no domínio do servidor da web e sem a jellyfish
confusão.
Posso fazer com que o Apache funcione como um proxy reverso simples, usando a seguinte configuração (snippet): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... mas isso exige que o URL do navegador contenha jellyfish
e vá para o URL raiz ( http://web-server
) fornece um 404 não encontrado.
Passei muito tempo tentando usar mod_rewrite
com e sem sua [P]
bandeira para contornar isso, mas sem sucesso. Tentei a ProxyPassMatch
diretiva, mas também não consigo entender isso direito.
Aqui está a configuração atual, conforme carregada no /etc/apache2/sites-available/
servidor da web. Observe que há um diretório de imagens hospedado localmente. Eu também mantive a proteção de exploração de proxy mod_rewrite e estou suprimindo algumas mod_security
regras que estavam dando falsos positivos.
<VirtualHost *:80>
ServerAdmin admin@drummer-server
ServerName drummer-server
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /images/ "/var/www/images/"
RewriteEngine On
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
ProxyPass /images !
ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
ProxyPassReverse / http://granny-server:8181/jellyfish
ProxyPreserveHost On
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Se eu for para http://web-server
, sou redirecionado para, http://web-server/jellyfish/home
mas isso gera um 404, com uma reclamação sobre a tentativa de acessar /jellyfish/jellyfish/home
- Nota: a barra de endereços do navegador não contém o dobro /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
E, se eu for http://web-server/login
, sou redirecionado para, http://web-server/jellyfish/login?0
mas isso gera um 404, com uma reclamação sobre a tentativa de acessar /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Então, suponho que de alguma forma repasse as regras duas vezes. Também estou um pouco confuso sobre de onde home
vem a parte da URL no primeiro exemplo.
Alguém pode me apontar na direção certa, por favor?
Obrigado, J.
ProxyPassMatch
por um uso equivalentemod_rewrite
, que aborda o desafio de removerjellyfish
os URLs. Agora estou analisando um número de 404s que aparecem em relação aos elementos subjacentes, como os componentes do Wicket exigidos pelo Karaf. Aqui está um trecho de código:# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/