Use ProxyPassMatch em todos os URLs, exceto o caminho raiz

1

Eu pesquisei alto e baixo por uma solução para isso e espero que seja apenas eu. O que estou tentando fazer é redirecionar todo o tráfego de um URL que hospedamos para outro servidor gerenciado por outro provedor que compramos, para que possamos personalizar o URL raiz.

Estou usando o httpd 2.2.3 (Apache). Isso é configurado em uma seção VirtualHost, também é SSL (não acho que isso deva importar).

Tudo funciona bem, exceto a exclusão.

O que eu tenho (simplificado) é:

ProxyPreserveHost On

<VirtualHost 1.2.3.4:443>        SSLProxyEngine On
    ProxyPassMatch ^/$   !
    ProxyPassMatch ^/(.*)$      https://proxy.example.com/$1
    ProxyPassReverse /  https://proxy.example.com/

    SSLEngine on
    ...

</VirtualHost>

No entanto, sempre vai para o site remoto. Eu tentei várias combinações como:

    ProxyPassMatch /$   !
    ProxyPassMatch ^/(.*)$      https://proxy.example.com/$1
    ProxyPassMatch com/   !
    ProxyPassMatch ^/(.*)$      https://proxy.example.com/$1

Eu também tentei ir para o outro lado (para combinar qualquer coisa com algo depois do /, ou seja:

    ProxyPassMatch ^/(..+)$     https://proxy.example.com/$1
    ProxyPassMatch /    !
    ProxyPassMatch ^/(..*)$     https://proxy.example.com/$1
    ProxyPassMatch /    !

Agora, a documentação diz que ele corresponde ao URL, mas não encontrei nenhuma evidência de que isso é o que realmente faz (isto é, a segunda variante acima com com / ).

Eu também tentei um monte de outras combinações que combinam tudo ou não combinam com nada.

Meu pensamento é que não estou entendendo o URL que está sendo fornecido à expressão regular, mas não tenho certeza de como analisá-lo. Eu aumentei o nível de depuração no Apache para debugar , e também não deu nada útil.

Felicidades.

    
por TrentDavis 24.03.2013 / 03:53

2 respostas

1

Eu descobri uma resposta, ou mais de uma solução: usar outro servidor (neste caso, um servidor local ainda na mesma instância httpd).

ou seja: as linhas acima agora são lidas:

ProxyPassMatch ^/$ 127.0.0.1:81
ProxyPassMatch ^/(.*)$ proxy.example.com/$1 

(mais a configuração usual do host para ser executada em uma nova porta e a configuração de um host virtual nessa porta). É um pouco confuso, mas parece resolver isso!

Ainda estou ansioso para saber se fiz algo errado e se há uma resposta "correta" para isso - já que considero isso um truque.

    
por 10.04.2013 / 23:39
2

Se eu tivesse que adivinhar, eu diria que seu problema vem da correspondência "^ /. * $", que corresponderá a '/'. Se você descartou a correspondência explícita para / e substituiu a passagem de proxy por "^ /. + $", poderá resolver seu problema. Não há promessas embora.

A diferença é o * é equivalente a. {0,} enquanto + é equivalente a. {1,}, portanto. * corresponderá a qualquer caractere ou não , enquanto você deseja uma correspondência pelo menos um.

    
por 14.10.2014 / 20:12