diff --git a/HowtoHaproxy.md b/HowtoHaproxy.md index 1e109f20..61a74ef3 100644 --- a/HowtoHaproxy.md +++ b/HowtoHaproxy.md @@ -225,6 +225,43 @@ backend domain2 server web02 192.0.2.2:80 cookie web02 check ~~~ +### Reproduire un ProxyPass Apache + +Avec Apache il est courant de faire un proxy qui modifie le chemin (_path_) : + +~~~ +ProxyPass / http://localhost:9999/path/to/app +ProxyPassReverse / http://localhost:9999/path/to/app +~~~ + +Ainsi, une requete à `/foo/bar` sera transise au final à `/path/to/app/foo/bar`. + +Il est possible de reproduire le même comportement directement dans HAProxy : + +~~~ +backend be_http + mode http + http-request set-path /path/to/app%[path] + acl header_location res.hdr(Location) -m found + http-response replace-header Location (https?://%[req.hdr(Host)](:[0-9]+)?)?(/path/to/app)(.*) \1\4 if header_location + + server localhost 127.0.0.1:9999 +~~~ + +La partie `http-request set-path` permet de modifier le path au moment du traitement de la requête (équivalent à `ProxyPass` pour Apache). + +Le serveur amont n'ayant aucune information de l'URL intiale, s'il doit envoyer un en-tête de redirection calculé de manière relative à la requête, celui-ci ne sera pas correct. Il faut le modifier à la volée avant de renvoyer la réponse. + +La partie `http-response replace-header` va donc remplacer la valeur de l'en-tête `Location`. +L'expression régulière ne sera satisfaite que si le domaine d'origine est utilisé (ou totalement absent), conservant ainsi la possibilité d'avoir des redirection intactes vers d'autres domaines. +Détail des captures : +1. http ou https, suivi du _host_ et éventuellement un port (facultatif) +2. port (factultatif) +3. partie du _path_ à supprimer +4. reste du _path_ à garder + +L'utilisation d'un ACL (très rapide) permet de ne faire l'opération (plus lente) que si l'entête est présent. + ### Exemple en mode TCP ~~~ @@ -492,4 +529,3 @@ net.ipv4.tcp_max_orphans=65536 # echo "show acl" | socat stdio /var/run/haproxy.sock # echo "show acl #" | socat stdio /var/run/haproxy.sock ~~~ -