Traefik路径路由配置问题:/api请求未正确转发至API服务
修正Traefik路由配置的步骤
你的配置里有几个关键问题导致/api前缀请求被错误路由到web服务,下面是修正后的完整配置:
version: "3.9" services: api: image: 'juliandimitrov/api-image:latest' container_name: 'api' expose: - "80" environment: - ASPNETCORE_URLS=http://0.0.0.0:80 labels: - "traefik.enable=true" - "traefik.http.routers.api.entrypoints=web" - "traefik.http.routers.api.rule=Host(`my-site.com`) && PathPrefix(`/api`)" - "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api" - "traefik.http.routers.api.middlewares=api-stripprefix@docker" - "traefik.http.routers.api.priority=10" - "traefik.http.services.api.loadbalancer.server.port=80" web: image: 'juliandimitrov/web-image:latest' container_name: 'web' expose: - "80" labels: - "traefik.enable=true" - "traefik.http.routers.web.entrypoints=web" - "traefik.http.routers.web.rule=Host(`my-site.com`)" - "traefik.http.services.web.loadbalancer.server.port=80" proxy: image: "traefik:v2.5" container_name: "proxy" command: - "--log.level=DEBUG" - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" ports: - "80:80" - "8080:8080" volumes: - //var/run/docker.sock:/var/run/docker.sock:ro
修改说明:
- 修正api路由的主机规则:把
HostRegexp(my-site.com/api)改为Host(my-site.com),HostRegexp是用来匹配主机名的,你的请求主机是my-site.com,路径才是/api,主机部分不能包含路径。 - 修正中间件引用名称:之前定义的中间件是
api-stripprefix,但引用时写的是myapp-stripprefix@docker,名称不匹配导致中间件未生效,现在改为一致的api-stripprefix@docker。 - 设置api路由优先级:添加
priority=10,让Traefik优先匹配/api前缀的路由规则,避免被web服务的通用主机规则拦截。 - 启用入口点配置(推荐):取消
entrypoints=web的注释,明确指定路由使用的入口点,配置逻辑更清晰。 - 添加服务暴露限制(可选):在Traefik的命令中加入
--providers.docker.exposedbydefault=false,只处理明确开启traefik.enable=true的服务,避免自动暴露无关容器。
重启docker-compose服务后,http://my-site.com/api/*的请求会正确路由到api服务,根路径请求仍会指向web服务。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

