web-dev-qa-db-fra.com

Haproxy changer une partie de l'url

J'ai une application qui a été renommée et je veux que Haproxy redirige vers le bon chemin tout en préservant les paramètres de demande

Voici ce que j'ai:

acl old_name path_dir -i /old_name
   http-request set-path /new_name/%[query] if old_name

Je veux que ça change de

www.site.com/old_name/Default.aspx?Id=123

à

www.site.com/new_name/Default.aspx?Id=123 but this is not working. 
5
Hugo Marques

Avec HAProxy 1.5: utilisez un en-tête temporaire pour créer un nouveau chemin à partir de celui existant dans la demande, puis effectuez directement une redirection

# Clean the request and remove any existing header named X-Rewrite
http-request del-header X-REWRITE

# Copy the full request URL into X-Rewrite unchanged
http-request add-header X-REWRITE %[url] if { path_beg /old_path }

# Change the X-REWRITE header to contain out new path
http-request replace-header X-REWRITE ^/old_path(/.*)?$ /new_path\1 if { hdr_cnt(X-REWRITE) gt 0 }

# Perform the 301 redirect
http-request redirect code 301 location http://%[hdr(Host)]%[hdr(X-REWRITE)] if { hdr_cnt(X-REWRITE) gt 0 }

Dans HAProxy 1.6, utilisez le filtre regsub

http-request redirect code 301 location http://%[hdr(Host)]%[url,regsub(^/old_path,/new_path,)] if { path_beg /old_path }

source parmi autres extraits de configuration utiles

Plus d'informations sont disponibles dans la documentation HAProxy pour le mot clé regsub .

11
Flint

Vous confondez la redirection d'URL avec la réécriture d'URL vers le backend.

Si vous souhaitez même réécrire , alors selon la documentation haproxy 1.6:

  • "set-path" réécrit le chemin de la requête avec le résultat de l'évaluation de la chaîne de format. La chaîne de requête, le cas échéant, est laissée intacte.

Donc la configuration correcte dans ce cas serait:

acl old_name path_dir -i /old_name
http-request set-path /new_name if old_name

Pour rediriger l'utilisateur:

redirect location /new_name if old_name
5
Flint

Pour toute personne essayant de modifier l'URI en REST, n'utilisez pas l'emplacement de redirection de demande http car les données d'en-tête sont perdues. Utilisez http -request set-uri.

http-request set-uri% [url,regsub(^/old,/new,)] if { path_beg /old }
2
Daniel Sá