URL do Apache reescrevendo no proxy reverso

11

Estou implantando o Apache na frente de um aplicativo hospedado pelo Karaf (o Apache e o Karaf estão em servidores separados). Eu quero que o Apache funcione como um proxy reverso e também para ocultar parte da URL.

O URL para obter a página de login do aplicativo diretamente do servidor de aplicativos é http://app-server:8181/jellyfish . As páginas são servidas pela instância do Jetty em execução no Karaf. Naturalmente, esse comportamento normalmente seria bloqueado pelo firewall para tudo, exceto o servidor proxy reverso.

Com o firewall desativado, se você atingir esse URL, o Jetty carregará a página de login. A barra de endereço do navegador muda corretamente para http://app-server:8181/jellyfish/login?0 e tudo funciona.

O que eu quero é http://web-server (ou seja, da raiz) para mapear para o Jetty no servidor de aplicativos com o nome do aplicativo ( jellyfish ) suprimido. por exemplo. O navegador mudaria para mostrar http://web-server/login?0 na barra de endereço e todos os URLs e conteúdos subsequentes seriam exibidos com o domínio do servidor da Web e sem a jellyfish clutter.

Eu 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 requer que o URL do navegador contenha jellyfish e vá para o URL raiz ( http://web-server ) fornece um 404 Not Found.

Eu passei muito tempo tentando usar mod_rewrite com e sem seu sinal [P] para contornar isso, mas sem sucesso. Eu então tentei a diretiva ProxyPassMatch , mas eu também não consigo acertar isso.

Aqui está a configuração atual, como é carregada em /etc/apache2/sites-available/ no servidor web. Observe que há um diretório de imagens hospedado localmente. Também mantive a proteção contra exploração de proxy do mod_rewrite e estou suprimindo algumas regras de mod_security 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 , serei redirecionado para http://web-server/jellyfish/home , mas isso será 404, com uma reclamação sobre a tentativa de acessar /jellyfish/jellyfish/home - NB, a barra de endereço do navegador não contém o dobro /jellyfish . / p>

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

E, se eu for para http://web-server/login , serei redirecionado para http://web-server/jellyfish/login?0 , mas isso dará um erro 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, estou supondo que estou de alguma forma passando pelas regras duas vezes. Também estou um pouco confuso sobre onde o home bit da URL vem no primeiro exemplo.

Alguém pode me indicar a direção certa, por favor?

Obrigado, J.

    
por Jeremy Gooch 08.11.2013 / 18:56

2 respostas

7

Foi assim que consegui que funcionasse. Além das alterações de acordo com o meu comentário à minha pergunta original, precisei excluir .js e .css da regra que adicionou uma barra final.

<VirtualHost *:80>
    ServerAdmin admin@localhost
    ServerName mydomain.com
    ServerAlias www.mydomain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteLog ${APACHE_LOG_DIR}/rewrite.log
    RewriteLogLevel 9

    Alias /images/ "/var/www/images/"

    RewriteEngine On

    # rewrite rule to prevent proxy exploit
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    # consolidate non-www requests onto the www subdomain
    RewriteCond  %{HTTP_HOST}    ^yourdomain\.com$
    RewriteRule  ^(.*)           http://www.yourdomain.com/$1  [R=301,L]

    # Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteCond  %{REQUEST_URI}  !^/(.*)(.js|.css)$
    RewriteCond  %{REQUEST_URI}  !(.*)/$
    RewriteRule  ^(.*)$          http://%{HTTP_HOST}$1/ [R=301,L]

    # 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/

    # suppress mod_security rules that were giving false positives
    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

</VirtualHost>
    
por 22.11.2013 / 11:44
1

Você já tentou:

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

Ou ainda mais simples:

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

Eu escrevi como lidei com o proxy reverso do Apache & Tomcat aqui se você quiser comparar / contrastar o que você configurou com o que eu uso.

Você pode adicionar isso para adicionar uma barra à URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
    
por 08.11.2013 / 21:12