Traefik代理下FastAPI应用静态文件无法访问及路由排除需求
解决思路与方案
问题根源
当前fhfront服务的Traefik路由规则会匹配所有发往example.com/www.example.com的请求,优先级高于fhback的/api前缀规则,导致/api/static或/static路径的请求被fhfront拦截,但该服务并未处理这类静态文件请求,最终引发错误。
方案一:修改fhfront的路由规则,排除静态文件路径
直接在fhfront的Traefik规则中添加排除条件,让/api/static和/static路径的请求绕过前端服务,转发到后端的fhback处理:
修改fhfront的traefik.http.routers.fhfront.rule标签为:
traefik.http.routers.fhfront.rule=Host(`example.com`,`www.example.com`) && !PathPrefix(`/api/static`) && !PathPrefix(`/static`)
该规则的含义是:仅当请求的Host是指定域名,且不以/api/static或/static开头时,才由fhfront处理。
方案二:给fhback添加专属静态文件路由(优先级更高)
如果不想修改前端服务的规则,可以给fhback新增一条Traefik路由,专门匹配静态文件路径,并设置更高的优先级,确保请求先被后端服务捕获:
在fhback的labels中添加以下配置:
- traefik.http.routers.fhback-static.rule=Host(`example.com`) && PathPrefix(`/api/static`) - traefik.http.routers.fhback-static.entrypoints=https - traefik.http.routers.fhback-static.tls.certresolver=le - traefik.http.routers.fhback-static.middlewares=firehouse-compress,fhback-stripprefix - traefik.http.routers.fhback-static.priority=200
priority=200:Traefik默认路由优先级为10,设置更高值确保这条路由先于fhfront的规则匹配- 复用已有的
fhback-stripprefix中间件,自动去掉/api前缀,让请求匹配FastAPI中挂载的/static路径
验证配置
修改完成后,重启Docker服务:
docker-compose up -d --force-recreate
之后尝试访问https://example.com/api/static/any-file.txt,即可正常获取静态文件。
内容的提问来源于stack exchange,提问作者s0mbre
相关产品推荐
相关产品推荐

