
Eu configurei uma configuração do Apache para tentar redirecionar /login
e 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 Location
cabeç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 alt
em 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 umLocation
cabeçalho com o valorhttps://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 ProxyPassReverse
directiva 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 alt
subdomínio apareceria no Location
cabeçalho se a ProxyPassReverse
diretiva não correspondesse à resposta.
Parece que você não precisa da primeira ProxyPassReverse
diretiva relacionada a /login
, pois esse URL não está sendo proxy.
Além disso, essas ProxyPassMatch
diretivas 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 ProxyPass
diretiva mais simples e usar a correspondência de prefixo simples em vez de um regex.
alt.example.org/login
redireciona 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 $1
referê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 RewriteCond
nã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 off
directiva 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/