You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Docker中配置Traefik子路径路由的故障排查求助

解决Traefik子路径访问Dashboard提示"path not found"的问题

你已经搞定了子域名的配置,离子路径正常工作只差两步关键调整!核心问题在于Traefik的API和Dashboard默认是在根路径下提供服务的,直接用子路径路由会出现路径匹配不完整、内部服务接收路径不匹配的问题,具体解决方法如下:

问题根源拆解

  • 你原本用的Path(/traefik)精确路径匹配,只会匹配/traefik这一个单一路径,但Traefik Dashboard实际会请求/traefik/dashboard//traefik/api/等子路径,精确匹配会导致这些请求直接返回"path not found"。
  • 就算路径匹配成功,Traefik内部的API服务期望接收的是根路径的请求,而不是带/traefik前缀的,所以需要把请求的前缀去掉后再转发给服务。

修改后的完整配置

更新你的docker-compose.yml中Traefik服务的labels部分,添加路径前缀匹配和路径重写中间件:

version: '3'
services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - 80:80
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      # 改用PathPrefix匹配所有以/traefik开头的路径
      - "traefik.http.routers.traefik.rule=Host(`ubuntudocker.domain.qa`) && PathPrefix(`/traefik`)"
      # 创建stripPrefix中间件,用于去掉/traefik前缀
      - "traefik.http.middlewares.traefik-strip-prefix.stripprefix.prefixes=/traefik"
      # 在路由中应用这个中间件
      - "traefik.http.routers.traefik.middlewares=traefik-strip-prefix"
      - "traefik.http.routers.traefik.service=api@internal"
networks:
  proxy:
    external: true

关键修改说明

  1. PathPrefix替代Path
    PathPrefix(/traefik)会匹配所有以/traefik开头的路径(比如/traefik/traefik/dashboard//traefik/api/health等),确保Dashboard的所有静态资源、API请求都能被正确路由。

  2. 添加stripPrefix中间件
    这个中间件会把请求URL中的/traefik前缀移除,再转发给Traefik的api@internal服务。比如/traefik/dashboard/会被转换成/dashboard/,这正是Traefik内部服务期望的路径格式。

测试验证步骤

  1. 重启Traefik容器:
    docker-compose down && docker-compose up -d
    
  2. 在浏览器中访问:http://ubuntudocker.domain.qa/traefik/dashboard/(注意末尾的斜杠,或者你也可以额外添加路由规则处理不带斜杠的访问场景,当前配置已覆盖主流需求)

这样就能正常通过子路径访问Traefik Dashboard了!

内容的提问来源于stack exchange,提问作者Detlef Schneider

火山引擎 最新活动