如何在Traefik中使用中间件实现HTTP到HTTPS的重定向
问题根因&排查解决步骤
1. 优先排查拼写错误(当前404的核心原因)
测试容器whoami的配置标签存在拼写错误:
# 错误写法,traefik拼写为treafik,a和e顺序反了,该标签完全不生效 - "treafik.http.routers.whoami.entrypoints=web,web-secure"
该标签失效后,80端口(web入口点)没有绑定whoami的路由规则,访问HTTP版本的地址自然匹配不到服务,返回404。
2. 修正全局EntryPoint命名不一致问题
你的Traefik全局配置中,重定向目标和443入口点命名不匹配:
# 重定向配置里目标叫 web-secure - --entrypoints.web.http.redirections.entryPoint.to=web-secure # 但443入口点定义叫 web-secured(多了一个d) - --entrypoints.web-secured.address=:443
命名不一致导致全局HTTP到HTTPS的重定向规则完全失效,需将二者命名统一,比如都改为web-secure。
3. 修正路由逻辑冲突问题
你当前的配置存在重复逻辑和错误配置:
- 既配置了全局80端口自动重定向到443,又给单个服务加了HTTPS重定向中间件,逻辑重复
- 给绑定了80端口(HTTP)的路由开启了
tls=true,会导致Traefik尝试在HTTP请求上做TLS握手,直接失败
推荐二选一配置即可:
方案A:使用全局重定向(更简单)
直接删除whoami配置里的重定向中间件标签,同时将whoami的路由仅绑定到443入口点:
labels: - "traefik.enable=true" # 仅绑定HTTPS入口点 - "traefik.http.routers.whoami.entrypoints=web-secure" - "traefik.http.routers.whoami.rule=Host(`whoami.testing.domain.com`)" - "traefik.http.routers.whoami.tls=true" - "traefik.http.routers.whoami.tls.certresolver=mytlschallenge"
全局配置已经会自动把所有80端口的请求重定向到443,不需要单独给服务加配置。
方案B:使用单独中间件重定向
如果不需要全局重定向,要给部分服务单独开重定向,就给HTTP和HTTPS分别定义独立路由:
labels: - "traefik.enable=true" # HTTP路由:绑定80端口,不开TLS,仅加跳转中间件 - "traefik.http.routers.whoami-http.entrypoints=web" - "traefik.http.routers.whoami-http.rule=Host(`whoami.testing.domain.com`)" - "traefik.http.routers.whoami-http.middlewares=httpsredirect@file" # HTTPS路由:绑定443端口,开TLS和证书 - "traefik.http.routers.whoami.entrypoints=web-secure" - "traefik.http.routers.whoami.rule=Host(`whoami.testing.domain.com`)" - "traefik.http.routers.whoami.tls=true" - "traefik.http.routers.whoami.tls.certresolver=mytlschallenge"
4. 验证生效步骤
- 修正所有配置后,删除旧的Traefik和whoami容器:
docker rm -f traefik whoami - 重新启动服务:
docker compose up -d - 查看Traefik日志确认无配置错误:
docker logs traefik - 访问HTTP版本的地址,验证是否正常301/302跳转到HTTPS。
内容的提问来源于stack exchange,提问作者PovilasID
相关产品推荐
相关产品推荐

