我们有几个 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 }
问题是,实际上,我们不希望子域 app.drawmessage.com 重定向到 https,但由于我们有该域的重定向,因此重定向规则适用于这两个域。以某种方式重新排序规则,以便排序与我们想要实现的配置相匹配,确实会产生相同的结果,并且我们会收到 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 }
The _dom
后缀意味着您希望将稍后给出的值与指定标头中找到的任意数量的完整、连续的类似域名的标记进行匹配,因此您提供的模式必须从字符串的开头开始or紧接着.
并且必须在字符串的末尾结束or紧接着是.
。这不是你想做的,所以hdr_dom()
不是正确的使用方法。
该符号可能意味着您正在比较左值与右值,但实际上比较是右值与左值。
放置在“use_backend”规则之后的“redirect”规则仍将在之前处理因为这些指令是由 HAProxy 代码的不同部分在请求处理的不同阶段处理的。在每类规则中,顺序都会被保留,但重定向会在请求处理的开始处进行处理,后端选择会在请求处理的结束处进行处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)