Dynamic set-cookie value on redirect

I want to set dynamic cookie value(from rand function) while doing re-direction. First i tried set-cookie option like following:

http-request redirect code 307 location %[capture.req.uri] set-cookie test=%[rand(20)]

but this gives me:

HTTP/1.1 307 Temporary Redirect
Cache-Control: no-cache
Content-length: 0
Location: /test
Set-Cookie: test=%[rand(20)]; path=/;

after reading haproxy source code i found a workaround, adding Set-Cookie header after location with \r\n works perfectly.

http-request redirect code 307 location %[capture.req.uri]\r\nSet-Cookie:\ test=%[rand(20)]

output:

HTTP/1.1 307 Temporary Redirect
Cache-Control: no-cache
Content-length: 0
Location: /test
Set-Cookie: test=16

I want to know whether this is a good practice?.

1 Like

I need this as well.

At first I thought I could use a http-request add-header command to do this, but that doesn’t work. After finding this: https://www.mail-archive.com/haproxy@formilux.org/msg25061.html I think your hack is the only way to do it. Although I definitely think it should have a way to add headers using log-format syntax.

Lua way

Cfg:
set your cookie and location headers
…
use_backend redirectWithSetCookie
…
backend redirectWithSetCookie
http-request use-service lua.redirectWithSetCookie

Lua:
core.register_service(“redirectWithSetCookie”, “http”, function(applet)
applet:set_status(301)
applet:add_header(“set-cookie”, applet.headers[‘set-cookie’][0])
applet:add_header(“location”, applet.headers[‘location’][0])
applet:start_response()
applet:send(’’)
end)

1 Like

Based on @happy’s idea I was able to do it easier in HA-Proxy v2.0.13 with Lua 5.3.3:

File redirect.lua:

core.register_service("RedirectAllHeaders", "http", function(applet)
    applet:set_status(302)
    applet:start_response()
    applet:send("")
end)

HAProxy config:

global
    lua-load                    /path/to/redirect.lua

backend bk_redir
    http-request  use-service  lua.RedirectAllHeaders
    http-response  add-header  Set-Cookie  redir=1;\ path=/
    http-response  add-header  X-LB-Backend  bk_redir
    http-response  add-header  Location  http://nowherefast.com/

frontend fr_http_https
    bind  11.22.33.44:80
    default_backend  bk_redir
3 Likes