如何在 HAProxy 中使用子域名重写 URL

如何在 HAProxy 中使用子域名重写 URL

当用户请求http://sub1.example.com/a/b/c我需要将此请求的主机名标头替换为 example.com,并将路径重写为http://example.com/sub1/a/b/c。我尝试使用 reqrep,但找不到如何将子域部分添加到路径中。

reqirep ^Host:\ (.*[^\.])(\.example\.com)      Host:\ example.com
reqrep ^([^\ :]*)\ (.*) \1\ /???/\2

我找到了 %[req.hdr(host),lower,field(1,'.')] 方法获取子域名,但我无法在 reqrep 方法的替换部分使用它。我如何在这一部分使用变量?

答案1

将子域名捕获到名为 的请求变量中req.rewrite_example(这是我刚刚编造的名称…… 是req.必需的,其余的可以是任何您想要的)... 通过捕获Host:标头的值,将其转换为小写,然后使用regsub()转换器清除.example.com末尾的 来实现此目的。仅当主机名以 -- 结尾时才执行此操作,.example.com否则变量未定义,-m found后续规则中的测试将为 false,并且这些规则将不会触发(这是我们想要的,对于我们可能看到的任何其他域名)。

http-request set-var(req.rewrite_example) req.hdr(host),lower,regsub(\.example\.com$,) if { hdr_end(host) -i .example.com }

如果变量已定义(如果第一条规则匹配,则应该如此),则将捕获的变量插入到路径的开头。

http-request set-path /%[var(req.rewrite_example)]%[path] if { var(req.rewrite_example) -m found }

如果变量已定义,则Host:用文字字符串替换标题。example.com

http-request set-header Host example.com if { var(req.rewrite_example) -m found }

...发送请求...

curl http://www.example.com/tacgnol.jpg

...并且以下标题被发送到后端:

GET /www/tacgnol.jpg HTTP/1.1
User-Agent: curl/7.35.0
Accept: */*
Host: example.com

完毕。

相关内容