HAProxy: hdr_dom(host) with redirects
HAProxy: hdr_dom(host) with redirects
我们有几个 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 }
还有其他域,仅针对此域过滤。如您所见,在为 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 }
问题是,实际上,我们不希望子域应用程序重定向到 https。drawmessage.com,但由于我们有域的重定向,因此重定向规则适用于两者。以某种方式重新排序规则,以便排序与我们想要实现的配置相匹配确实会产生相同的结果,并且我们会收到 haproxy 警告:
a 'redirect' rule placed after a 'use_backend' rule will still be processed before.
如果配置行的顺序影响处理请求的顺序,那么顺序本身就是一个配置参数,为什么重定向规则在use_backend规则之前处理? ...
有人建议如何使用正确的重定向首选项实现基于域的路由吗?我更喜欢干净简单的方式,..
不要使用 hdr_dom()
。只需使用 hdr()
.
redirect prefix https://drawmessage.com code 301 if { hdr(host) -i drawmessage.com }
_dom
后缀表示您希望将稍后给出的值与在指定 header 中找到的任意数量的完整、连续的 domain-name-like 标记相匹配,因此您提供的模式必须在字符串的开头 或 紧跟在 .
之后,并且必须在字符串的结尾 或 立即结束接着是 .
。那不是您想要做的,因此 hdr_dom()
不是正确的提取方式。
该符号可能暗示您正在比较左值与右值,但实际上比较的是右值与左值。
放置在 'use_backend' 规则之后的 'redirect' 规则仍将在 之前处理,因为这些指令由 HAProxy 代码的不同部分处理,在请求处理的不同阶段。在每个 class 规则中,顺序被保留,但重定向在接近开始处处理,后端选择接近请求处理的结尾。
我们有几个 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 }
还有其他域,仅针对此域过滤。如您所见,在为 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 }
问题是,实际上,我们不希望子域应用程序重定向到 https。drawmessage.com,但由于我们有域的重定向,因此重定向规则适用于两者。以某种方式重新排序规则,以便排序与我们想要实现的配置相匹配确实会产生相同的结果,并且我们会收到 haproxy 警告:
a 'redirect' rule placed after a 'use_backend' rule will still be processed before.
如果配置行的顺序影响处理请求的顺序,那么顺序本身就是一个配置参数,为什么重定向规则在use_backend规则之前处理? ...
有人建议如何使用正确的重定向首选项实现基于域的路由吗?我更喜欢干净简单的方式,..
不要使用 hdr_dom()
。只需使用 hdr()
.
redirect prefix https://drawmessage.com code 301 if { hdr(host) -i drawmessage.com }
_dom
后缀表示您希望将稍后给出的值与在指定 header 中找到的任意数量的完整、连续的 domain-name-like 标记相匹配,因此您提供的模式必须在字符串的开头 或 紧跟在 .
之后,并且必须在字符串的结尾 或 立即结束接着是 .
。那不是您想要做的,因此 hdr_dom()
不是正确的提取方式。
该符号可能暗示您正在比较左值与右值,但实际上比较的是右值与左值。
放置在 'use_backend' 规则之后的 'redirect' 规则仍将在 之前处理,因为这些指令由 HAProxy 代码的不同部分处理,在请求处理的不同阶段。在每个 class 规则中,顺序被保留,但重定向在接近开始处处理,后端选择接近请求处理的结尾。