Tom Braarup wrote:
How do I use "ltrim"
(https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#7.3.1-ltrim) ?
Trying to do a redirect short.com/123456 to example.com/id123456
http-request redirect locationhttps://example.com/id%[path,ltrim(/)] if { req.hdr(host)
-i short.com && path_reg -i ^/\d+$ }
There are two things I see in your config that are not along the lines
Haproxy configuration needs to be written.
1) You seem to get bitten by the way the config parser works and need to
use quoting. Otherwise, the comma you are using to produce the
"location" argument will not be interpreted correctly. See the
explanations at
https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#2.2
2) Haproxy's configuration language does not allow logical operators
like '&&' to form complex conditions (and, while we're at it, not
parentheses). You'll need to cope with the use of the implicit "or"
(within one ACL, more so for named ACLs), the implicit "and" (in between
single ACLs) and the "or" keyword (outside of individual conditions).
See
https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#7.2
(This really has to do with how you want to look at it, but from the
formal computer science perspective, to construct a valid Haproxy
configuration, you need to express yourself in "conjunctive normal form".)
Putting aside theoretical thoughts, as far as I understand what you're
trying to do, you could write the above line like this:
http-request redirect location "https://example.com/id%[path,ltrim(/)]"
if { req.hdr(host) -i short.com } { path_reg -i ^/\d+$ }
This is at least valid Haproxy config syntax, although I'm not 100
percent sure this does what you intend to do.
Another way to tackle a substitution like that would be to use "regsub",
as you were using a regular expression already. But then, with regsub
and backreferences like "\1", you will really need to look into the
section about quoting in the manual, as it gets a bit complicated at
that point.
Good luck,
Jens