文档不够,基础来凑

Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。在使用的时候遇到了有个很特别的问题,我的需求是前端(此前端指的是traefik的frontends)

而文档中的AddPrefix符合我的需求,我正常的使用这个配置

  [frontends.a]
  backend = "a"
    [frontends.a.routes.a]
    rule = "Host:a.example.com;AddPrefix:/a"
  [frontends.b]
  backend = "b"
    [frontends.b.routes.b]
    rule = "Host:b.example.com;AddPrefix:/b"

在我的两个服务中设置的路由是/a/b

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	g := gin.Default()
	g.StaticFS(`/a`, gin.Dir(`a`, true))
	g.StaticFS(`/b`, gin.Dir(`b`, true))
	g.Run(`:1234`)
}

于是问题就出现了,当我访问a.example.com/时,会自动跳转到a.example.com/a,另一个也一样,访问b.example.com/会自动跳转到b.example.com/b,这样在后端服务访问到的就是localhost:1234/a/a铁定返回404。

我原以为是AddPrefix的问题,错误地猜想当访问a.example.com/时,它会产生一个301跳转来达到为请求URL路径天假前缀的目的,后来经大神指点,traefik只是一个反代工具,不可能承担跳转这种功能,然后逐层往上分析,查询服务的访问日志,发现其实是go的框架gin做的跳转这件事,理由也很简单,在go服务的路由少加了/,gin默认做了跳转,最后把/a/b路由改成/a//b/解决。