ti-enxame.com

Reescrita de URL do Apache no proxy reverso

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 opere como um 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 é para 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 subseqüentes seriam veiculados com o domínio do servidor da web e sem a desordem jellyfish.

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 o seu [P] flag para contornar isso, mas sem sucesso. Tentei a diretiva ProxyPassMatch, mas também não consigo entender isso direito.

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. Eu também mantive o proteção de exploração de proxy mod_rewrite e estou suprimindo algumas mod_security regras que estavam dando falsos positivos.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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 indica 404, com uma reclamação sobre a tentativa de acessar /jellyfish/jellyfish/home - NB a barra de endereços do navegador não contém o duplo /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

E, se eu for para http://web-server/login, Sou redirecionado para http://web-server/jellyfish/login?0, mas isso indica 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 a origem do bit home da URL no primeiro exemplo.

Alguém pode me apontar na direção certa, por favor?

Obrigado, J.

12
Jeremy Gooch

Foi assim que eu consegui funcionar. Além das alterações feitas no meu comentário da minha pergunta original, eu precisava excluir .js e .css da regra que adicionou uma barra final.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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>
10
Jeremy Gooch

Você tentou:

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

Ou ainda mais simplesmente:

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

Eu escrevi como lido com o proxy reverso do Apache e o Tomcat aqui se você quiser comparar/contrastar o que você configura com o que eu uso.

Convém adicionar isso para adicionar uma barra final ao URL:

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