![HAProxy 1.7 使用映射文件重定向/重写特定域](https://linux22.com/image/718238/HAProxy%201.7%20%E4%BD%BF%E7%94%A8%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6%E9%87%8D%E5%AE%9A%E5%90%91%2F%E9%87%8D%E5%86%99%E7%89%B9%E5%AE%9A%E5%9F%9F.png)
我是 HAProxy 的新手,我想重定向映射文件定义域中的请求。一个简短的示例:在我的 redirect.map 文件中:
abc.com xyz.com
def.ru idk.com
因此,如果用户向域 abc.com 或 def.ru 发送请求,他将被重定向到定义的域。但如果他请求 asd.com,则不应进行重定向。我的目标是在映射文件中定义这些重定向,以便于更改。
接下来我想对 uri 重写做同样的事情。例如:
http-request set-uri X if Y from rewrite.map
因此我的地图文件将如下所示:
(my X variable) (my Y variable)
/abc/def/specific www.mydomain.com/specific
我是否有机会使用 HAProxy 来做到这一点?
答案1
http-request redirect location https://%[hdr(host),map(/etc/haproxy/rewrite.map)]%[capture.req.uri] code 301 if { hdr(host),map(/etc/haproxy/rewrite.map) -i -m found }
这hdr(x)
拿来读取请求标头x
并返回找到的值。(从技术上讲,它读取此标头的最后一次出现,但该Host
标头应该只出现一次。)
这map
转换器取其前面的值(与 连接,
),在地图表中查找,并返回结果。
如果未找到匹配项,则不返回任何结果,因此-m found
测试不返回任何结果并且规则不匹配。(-i
使查找不区分大小写)。
如果规则匹配,我们将为Location
响应标头构建一个新的 URL,使用文字字符串https://
(http
如果合适,将其更改为)+ 来自映射文件重写的主机名 + 原始请求 URI,该 URL 以前导开头/
并包含路径和查询字符串,保留整个请求 URI。
如果您不想保留原始 URI,而只是将所有内容发送到目标站点的主页,然后%[capture.req.uri]
从表达式中删除。