HAProxy:带有重定向的 hdr_dom(host)

Kir*_*ván 3 haproxy

我们有几个 haproxy 配置在大多数情况下运行良好。在我们的场景中,我们只是根据域名路由请求。这是一个域的示例,drawmessage.com:

frontend http
    bind *:80

    redirect prefix http://app.drawmessage.com code 301 if { hdr_dom(host) -i www.app.drawmessage.com }
    redirect prefix http://drawmessage.com code 301 if { hdr_dom(host) -i www.drawmessage.com }

    redirect prefix https://drawmessage.com code 301 if { hdr_dom(host) -i drawmessage.com }

    use_backend http:app.drawmessage.com if { hdr_dom(host) -i app.drawmessage.com }
    use_backend http:app.drawmessage.com if { hdr_dom(host) -i app-drawmessage-com.d250.hu }
    use_backend http:drawmessage.com if { hdr_dom(host) -i drawmessage.com }
    use_backend http:drawmessage.com if { hdr_dom(host) -i drawmessage-com.d250.hu }
Run Code Online (Sandbox Code Playgroud)

还有其他域,仅针对该域进行过滤。如您所见,在 www 重定向后,我们为 drawmessage.com 应用了特殊重定向,但理论上不适用于 app.drawmessage.com。

frontend https
     bind *:443 ssl crt /var/haproxy

     redirect prefix https://app.drawmessage.com code 301 if { hdr_dom(host) -i www.app.drawmessage.com }
     redirect prefix https://drawmessage.com code 301 if { hdr_dom(host) -i www.drawmessage.com }

     use_backend https:app.drawmessage.com if { hdr_dom(host) -i app.drawmessage.com }
     use_backend https:app.drawmessage.com if { hdr_dom(host) -i app-drawmessage-com.d250.hu }
     use_backend https:drawmessage.com if { hdr_dom(host) -i drawmessage.com }
     use_backend https:drawmessage.com if { hdr_dom(host) -i drawmessage-com.d250.hu }
Run Code Online (Sandbox Code Playgroud)

问题是,实际上,我们不希望子域 app.drawmessage.com 重定向到 https,但是由于我们有域的重定向,因此重定向规则适用于两者。以某种方式重新排序规则,以便排序匹配我们想要实现的配置确实会产生相同的结果,并且我们会收到 haproxy 警告:

a 'redirect' rule placed after a 'use_backend' rule will still be processed before.
Run Code Online (Sandbox Code Playgroud)

如果配置行的顺序影响处理请求的顺序,因此排序本身就是一个配置参数,为什么重定向规则在 use_backend 规则之前处理?...

任何人都对如何使用正确的重定向首选项实现基于域的路由有建议?我更喜欢干净简单的方式,..

Mic*_*bot 7

不要使用hdr_dom(). 只需使用hdr().

redirect prefix https://drawmessage.com code 301 if { hdr(host) -i drawmessage.com }
Run Code Online (Sandbox Code Playgroud)

_dom你想匹配后对任何数量的完整,连续的给定值后缀手段域名样令牌在指定的头发现的,所以您提供的模式必须在字符串的开头无论是开始还是紧跟在.和绝在所述串的结束端任一紧跟一个.。这不是您想要做的,因此hdr_dom()不是要使用的正确提取。

该符号可能暗示您正在将左值与右值进行比较,但该比较实际上是右值与左值的比较。

放置在“use_backend”规则之后的“重定向”规则仍将在之前处理,因为这些指令由 HAProxy 代码的不同部分在请求处理的不同阶段处理。在每一类规则中,顺序被保留,但重定向在开始附近处理,后端选择在请求处理结束附近处理。