我有一个已重命名的应用程序,我希望 Haproxy 重定向到正确的路径,同时保留请求参数
这就是我所拥有的:
acl old_name path_dir -i /old_name
http-request set-path /new_name/%[query] if old_name
我希望它从
www.site.com/old_name/Default.aspx?Id=123
到
www.site.com/new_name/Default.aspx?Id=123 but this is not working.
答案1
使用 HAProxy 1.5:使用临时标头从请求中的现有路径构建新路径,然后直接执行重定向
# 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 }
在 HAProxy 1.6 中,使用 regsub 过滤器
http-request redirect code 301 location http://%[hdr(host)]%[url,regsub(^/old_path,/new_path,)] if { path_beg /old_path }
更多信息请访问regsub 关键字的 HAProxy 文档。
答案2
你很困惑url 重定向和网址重写到后端。
你是否应该想要改写,然后根据 haproxy 1.6 文档:
- “set-path”用格式字符串的评估结果重写请求路径。查询字符串(如果有)保持不变。
因此正确的配置在这种情况下将会 :
acl old_name path_dir -i /old_name
http-request set-path /new_name if old_name
到重定向用户 :
redirect location /new_name if old_name
答案3
对于任何试图从 uri 更改为 REST API 的人,不要使用 http 请求重定向位置因为标头数据已丢失。使用http 请求 set-uri。
http-request set-uri %[url,regsub(^/old,/new,)] if { path_beg /old }