我们有几个 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 规则之前处理?...
任何人都对如何使用正确的重定向首选项实现基于域的路由有建议?我更喜欢干净简单的方式,..
不要使用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 代码的不同部分在请求处理的不同阶段处理。在每一类规则中,顺序被保留,但重定向在开始附近处理,后端选择在请求处理结束附近处理。