Reescrita de URL do Apache no proxy reverso

12

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?0e 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?0na 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 jellyfishconfusã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 jellyfishe vá para o URL raiz ( http://web-server) fornece um 404 não encontrado.

Passei muito tempo tentando usar mod_rewritecom e sem sua [P]bandeira para contornar isso, mas sem sucesso. Tentei a ProxyPassMatchdiretiva, 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_securityregras 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/homemas 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?0mas 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 homevem a parte da URL no primeiro exemplo.

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

Obrigado, J.

Jeremy Gooch
fonte
Fiz algum progresso nisso e agora substituí-lo ProxyPassMatchpor um uso equivalente mod_rewrite, que aborda o desafio de remover jellyfishos 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/
Jeremy Gooch 11/11

Respostas:

10

Foi assim que eu consegui funcionar. Além das alterações de acordo com o meu comentário na minha pergunta original, eu precisava excluir .jse .cssda regra que adicionava 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>
Jeremy Gooch
fonte
1

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]
JakeGould
fonte
Muito obrigado pela resposta. Infelizmente, isso resolve apenas a parte direta do problema de proxy. O que estou perdendo é como remover a palavra "água-viva" da visibilidade na barra de endereços do navegador do cliente, de modo que seja http://web-serversilenciosamente transferido para proxy http://app-server:8181/jellyfishe vice-versa.
precisa