2 votes

Utilisez ProxyPassMatch sur toutes les URLs sauf le chemin d'accès à la racine.

J'ai cherché partout une solution à ce problème, et j'espère que ce n'est que moi. Ce que j'essaie de faire, c'est de rediriger tout le trafic d'une URL que nous hébergeons, vers un autre serveur géré par un autre fournisseur auprès duquel nous nous approvisionnons, afin de pouvoir personnaliser l'URL racine.

J'utilise httpd 2.2.3 (Apache). Ceci est configuré dans une section VirtualHost, c'est aussi SSL (je ne pense pas que cela devrait avoir de l'importance cependant).

Tout fonctionne bien, sauf l'exclusion.

Ce que j'ai (simplifié) est :

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>

Toutefois, il つねに va vers le site distant. J'ai essayé un tas de combinaisons telles que :

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

J'ai également essayé d'aller dans l'autre sens (pour faire correspondre n'importe quoi avec quelque chose après le /, par exemple :

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

La documentation dit qu'il correspond à l'URL, mais je n'ai trouvé aucune preuve que c'est ce qu'il fait réellement (c'est-à-dire la deuxième variante ci-dessus avec com/ ).

J'ai également essayé un tas d'autres combinaisons qui soit correspondent à tout, soit ne correspondent à rien.

Je pense que je ne comprends pas l'URL qui est donnée à l'expression régulière, mais je ne sais pas comment l'examiner. J'ai augmenté le niveau de débogage dans Apache à déboguer et il ne donne rien d'utile non plus.

A la vôtre.

5voto

OstermanA Points 51

Si je devais deviner, je dirais que votre problème provient de la correspondance "^/.*$", qui correspond à '/'. Si vous abandonnez la correspondance explicite avec / et que vous remplacez la passe du proxy par "^/.+$", c'est que mai résoudre votre problème. Aucune promesse cependant.

La différence est que * est équivalent à .{0,} alors que + est équivalent à .{1,}, donc .* correspondra à tout ou pas de caractères, alors que vous voulez une correspondance sur au moins un.

ie : La ligne devrait se lire :

ProxyPassMatch ^/(.+)$ proxy.example.com/$1

1voto

maxt3r Points 317

J'ai trouvé une réponse, ou plutôt un contournement : utiliser un autre serveur (dans ce cas un serveur local toujours sur la même instance httpd).

ie : Les lignes ci-dessus se lisent maintenant :

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

(plus la configuration habituelle de l'hôte pour fonctionner sur un nouveau port, et la configuration d'un hôte virtuel sur ce port). C'est un peu compliqué, mais cela semble fonctionner !

Je suis toujours curieux de savoir si j'ai fait quelque chose de mal et s'il existe une réponse "correcte" à cette question, car je considère qu'il s'agit d'une sorte de piratage.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X