基于Traefik与Marathon的同主机多路径路由配置问题
我明白你现在的困境——本来想把web.myblog.com的根路径流量导去应用1,/app路径导去应用2,但现在所有请求都跑到应用1那边了。问题出在Traefik的路由匹配逻辑和规则优先级上,咱们一步步来解决:
问题根源
你的应用1用了HostRegexp:{subdomain:[a-z]+}.myblog.com,这个规则会匹配所有子域名的myblog.com域名(包括web.myblog.com)。而Traefik默认情况下,当多个路由规则都能匹配请求时,会按照规则的注册顺序或者默认优先级来选择,这就导致应用1的规则“抢”走了所有web.myblog.com的流量,包括/app路径的。
而且你提到Golang不支持负向前瞻,所以没法直接在应用1的规则里排除/app路径,那咱们换个思路:调整路由优先级。
解决方案:给应用2设置更高的优先级
Traefik允许通过traefik.frontend.priority标签来指定路由的优先级,数值越高,路由规则越先被匹配。咱们给应用2的规则设置比应用1更高的优先级,这样当请求是web.myblog.com/app时,会先匹配应用2的规则,剩下的web.myblog.com其他路径请求再匹配应用1。
调整后的配置
应用1的标签:
traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.myblog.com;PathPrefix:/ traefik.frontend.priority=10这里保留原来的HostRegexp规则,加上
PathPrefix:/明确匹配根路径及以下,同时设置较低的优先级(10)。应用2的标签:
traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/app traefik.frontend.priority=20保留原来的Host和PathPrefix规则,设置更高的优先级(20),确保它先被Traefik评估。
为什么这个方案有效
当Traefik收到web.myblog.com/app的请求时,会先检查优先级更高的应用2规则——精确匹配web.myblog.com域名,且路径以/app开头,完全符合,所以流量会导向应用2。而对于web.myblog.com的其他路径(比如/、/post等),应用2的规则不匹配,就会落到优先级较低的应用1规则上,符合你的预期。
额外小贴士
如果你还需要确保应用1的规则不会意外匹配其他子域名的/app路径,也可以给应用1的规则加上更具体的Path限制,但其实通过优先级已经能解决核心问题了。
内容的提问来源于stack exchange,提问作者Willem D'Haeseleer

