Apache ProxyPass + RewriteRule?

Apache ProxyPass + RewriteRule?

Eu configurei uma configuração do Apache para tentar redirecionar /logine ProxyPass todas as outras solicitações:

RewriteEngine on
RewriteCond "%{REQUEST_URI}" "^/login$"
RewriteRule "^/login$" "https://sub.example.org/$1" [L,R]

SSLProxyEngine on
ProxyRequests off
ProxyPassMatch   ^/login ! # Prevent proxy on /login
ProxyPassReverse ^/login ! # Prevent proxy on /login
ProxyPassMatch   ^/      https://sub.example.org/
ProxyPassReverse ^/      https://sub.example.org/
ProxyPreserveHost off
RequestHeader set Host sub.example.org
Header set Host alt.example.org

A maioria dos resultados que verifiquei são os esperados:

  • alt.example.org/login redireciona para sub.example.org/login
  • alt.example.org/users mostra o conteúdo de sub.example.org/users (sem redirecionamento)

...mashttps://alt.example.org/(caminho vazio) resulta em um Locationcabeçalho com o valor https://alt.example.org^/login. Uau! O que está causando esse redirecionamento com o ^domínio e por que ele faz referência altem vez de sub?

O log do aplicativo Rails que está sendo executado acima do Apache diz que o próprio aplicativo Rails está redirecionando parahttps://sub.example.org/login, o que faz mais sentido porque o ProxyPass significa que o Rails deve ver apenas sub.example.org e não alt.example.org. Então, por que o Apache está distribuindo https://alt.example.org^/login?

Responder1

...mas https://alt.example.org/(caminho vazio) resulta em um Locationcabeçalho com o valor https://alt.example.org^/login. Uau! O que está causando esse redirecionamento no ^domínio e por que ele faz referência a alt em vez de sub?

A ProxyPassReversedirectiva não toma uma regex como primeiro argumento e parece ser aqui que o conflito está a acontecer. E isso também não pode ser !considerado o segundo argumento. O altsubdomínio apareceria no Locationcabeçalho se a ProxyPassReversediretiva não correspondesse à resposta.

Parece que você não precisa da primeira ProxyPassReversediretiva relacionada a /login, pois esse URL não está sendo proxy.

Além disso, essas ProxyPassMatchdiretivas parecem fazer proxy de tudo para a raiz de https://sub.example.org/- você não deseja fazer proxy para o caminho de URL correspondente no domínio de destino? Embora, estranhamente, pareça ser isso que está acontecendo nos resultados observados? Se você deseja fazer proxy para o mesmo caminho de URL, você pode usar a ProxyPassdiretiva mais simples e usar a correspondência de prefixo simples em vez de um regex.

alt.example.org/loginredireciona parasub.example.org/login

Embora isso não seja realizado pelo "redirecionamento" que você postou no topo, o que redirecionaria para a raiz do documento, já que a $1referência anterior está vazia porque não há subpadrão de captura noRewriteRule padrão. Como você afirma mais tarde, "o próprio aplicativo Rails está redirecionando para https://sub.example.org/login".

Portanto, para redirecionar para sub.example.org/login(o que parece ser a intenção), você precisaria alterar a diretiva para ler algo como o seguinte:

RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]

A diretiva anterior RewriteCondnão é necessária aqui, pois ela simplesmente repete a mesma verificação que você já está realizando noRewriteRule padrão.

RequestHeader set Host sub.example.org

Esta linha é redundante, uma vez que é este o objectivo da ProxyPreserveHost offdirectiva anterior.

Header set Host alt.example.org

Esta linha também parece redundante, pois Hosté um cabeçalho de solicitação e não um cabeçalho de resposta.

ProxyPassMatch   ^/login ! # Prevent proxy on /login

Além disso, o Apache não oferece suporte a comentários de final de linha. Somente por causa de uma "peculiaridade" na maneira como as diretivas do Apache são processadas impede que esse comentário específico de final de linha interrompa seu servidor!

Portanto, levando em consideração os pontos acima, tente o seguinte:

RewriteEngine on

# Externally Redirect "/login" to other domain
RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]

SSLProxyEngine on

ProxyRequests off
ProxyPreserveHost off

# Prevent proxy on /login
ProxyPass /login !

# Proxy all other URLs
ProxyPass / https://sub.example.org/
ProxyPassReverse / https://sub.example.org/

informação relacionada