Docker部署Traefik反向代理时的重定向次数过多问题
解决Traefik仪表盘重定向次数过多的问题
直接说几个核心问题和修改方法:
1. 修正证书存储路径(最容易踩的坑)
你配置里写的证书存储路径是/acme.json,但实际挂载的目录是./letsencrypt:/letsencrypt,Traefik根本找不到证书文件,导致TLS配置异常,直接触发重定向循环。
把command里的对应行改成:
--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
2. 替换TLS挑战为DNS挑战(适配Cloudflare代理模式)
如果Cloudflare开启了代理(橙色云朵),TLS挑战完全无效——ACME的验证请求会先到Cloudflare,无法直接到达Traefik,导致证书无法正常获取/使用,进而引发TLS错误和重定向问题。
换成Cloudflare DNS挑战,步骤如下:
- 去Cloudflare生成API令牌(权限选「Zone:DNS:Edit」,仅给目标域名权限即可)
- 删除原配置里的
--certificatesresolvers.myresolver.acme.tlschallenge=true,替换为:
--certificatesresolvers.myresolver.acme.dnschallenge=true --certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare
- 给traefik服务添加环境变量,填入你的API令牌:
environment: - CLOUDFLARE_DNS_API_TOKEN=你的Cloudflare API令牌
3. 调整Cloudflare SSL/TLS模式
别用「灵活」模式!改成「严格」或「完全(严格)」。
「灵活」模式下,Cloudflare与你的服务器之间用HTTP通信,而Traefik的web入口又强制重定向到HTTPS,直接形成循环:浏览器→Cloudflare(HTTPS)→Traefik(HTTP)→重定向到HTTPS→Cloudflare再转成HTTP发过来...无限重复。
4. 基础认证不要用明文(必须修改)
你现在写的USERNAME:Password12345是明文,Traefik不识别,得用加密后的哈希值。用下面的命令生成:
echo $(htpasswd -nB USERNAME) | sed -e s/\\$/\\$\\$/g
把生成的字符串替换掉标签里的明文密码。
修改后的完整配置示例
version: "3.8" services: traefik: image: "traefik:v2.11" container_name: "traefik" command: - "--log.level=DEBUG" - "--api.dashboard=true" - "--accesslog=true" - "--providers.docker.network=web" - "--providers.docker.exposedByDefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--entryPoints.web.http.redirections.entrypoint.scheme=https" - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.websecure.http.tls.certresolver=myresolver" - "--certificatesresolvers.myresolver.acme.email=name@domain.com" - "--certificatesresolvers.myresolver.acme.dnschallenge=true" - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "443:443" - "80:80" environment: - CLOUDFLARE_DNS_API_TOKEN=你的Cloudflare API令牌 volumes: - "./letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" labels: - "traefik.enable=true" - "traefik.http.routers.mydashboard.rule=Host(`subdomain.domain.net`)" - "traefik.http.routers.mydashboard.tls=true" - "traefik.http.routers.mydashboard.service=api@internal" - "traefik.http.routers.mydashboard.middlewares=myauth" - "traefik.http.middlewares.myauth.basicauth.users=USERNAME:$apr1$xxxxxx$xxxxxxxxx" # 替换成生成的哈希值 networks: - web networks: web: external: true
内容的提问来源于stack exchange,提问作者TrashThrash
相关产品推荐
相关产品推荐

