使用Traefik StripPrefix配置Registry UI时静态资源请求404求助
解决Traefik反向代理Registry UI时静态资源丢失的问题
你遇到的问题根源在于registry-ui应用默认假设自己运行在域名根路径下,因此生成的静态资源(CSS、JS、图标)引用路径均以/开头(比如/docker-registry-ui.css)。当通过Traefik的/registry子路径访问时,这些资源请求会直接发送到https://my-dns.org/docker-registry-ui.css,而非预期的https://my-dns.org/registry/docker-registry-ui.css,最终导致资源加载失败。
解决方案:给registry-ui设置子路径前缀环境变量
joxit/docker-registry-ui镜像支持通过BASE_URL环境变量指定应用的基础路径,让所有静态资源和接口请求自动带上该前缀。只需在Docker Compose配置中给registry-ui服务添加此环境变量:
... registry-ui: image: joxit/docker-registry-ui:latest container_name: registry-ui restart: unless-stopped environment: - REGISTRY_TITLE=My registry - NGINX_PROXY_PASS_URL=http://registry:5000 - SINGLE_REGISTRY=true - DELETE_IMAGES=true - BASE_URL=/registry # 新增此环境变量 depends_on: - registry labels: - "traefik.enable=true" - "traefik.http.routers.registry-ui.entrypoints=https" - "traefik.http.routers.registry-ui.rule=Host(`my-dns.org`) && PathPrefix(`/registry`)" - "traefik.http.routers.registry-ui.middlewares=test-stripprefix" - "traefik.http.routers.registry-ui.tls.certresolver=myresolver" - "traefik.http.middlewares.test-stripprefix.stripprefix.prefixes=/registry" - "traefik.http.middlewares.test-stripprefix.stripprefix.forceSlash=false" - "traefik.http.services.registry-ui.loadbalancer.server.port=80" ...
原理说明
添加BASE_URL=/registry后,registry-ui应用会自动调整所有资源的引用路径,比如原本的/docker-registry-ui.css会变成/registry/docker-registry-ui.css,与Traefik的路径转发规则匹配,确保资源请求能被正确路由到registry-ui服务。
同时你现有的Traefik stripprefix中间件依然有效:它会把请求路径中的/registry前缀去掉后转发给registry-ui服务,而应用内部处理的是去掉前缀后的路径,两者配合完全正常。
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

