Traefik非全局HTTP转HTTPS重定向:有无更优实现方式?
简洁实现非全局HTTP转HTTPS及路由可控方案
1. 用中间件链简化入口点配置,实现按需重定向
不需要分别为HTTP/HTTPS重复声明入口点逻辑,通过按需绑定中间件就能实现单容器级别的重定向控制:
- 先在动态配置文件中定义通用的
redirect-to-https中间件 - 仅给需要重定向的容器的HTTP路由绑定该中间件,HTTPS路由绑定认证等其他逻辑
docker-compose配置片段
services: whoami: image: traefik/whoami labels: - traefik.enable=true # HTTP路由:绑定web入口点,触发重定向 - traefik.http.routers.whoami-http.entrypoints=web - traefik.http.routers.whoami-http.rule=Host(`whoami.local`) - traefik.http.routers.whoami-http.middlewares=redirect-to-https@file # HTTPS路由:绑定websecure入口点,启用TLS和认证 - traefik.http.routers.whoami-https.entrypoints=websecure - traefik.http.routers.whoami-https.rule=Host(`whoami.local`) - traefik.http.routers.whoami-https.tls=true - traefik.http.routers.whoami-https.middlewares=basic-auth@file # 服务转发基础配置 - traefik.http.services.whoami.loadbalancer.server.port=80
动态配置文件(如dynamic.yml)
http: middlewares: redirect-to-https: redirectScheme: scheme: https permanent: true basic-auth: basicAuth: users: - "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # 示例密码 test
这种方式下,不绑定redirect-to-https中间件的容器不会触发重定向,完全保留每个容器的控制权。
2. 统一路由管理:动态配置文件+Docker服务标签分离
如果不想在docker-compose中写大量路由标签,可以把路由逻辑完全放到动态配置文件,Docker仅负责注册服务实例:
- docker-compose只保留
traefik.enable=true和服务端口配置 - 路由、中间件绑定、入口点等逻辑全部在动态配置中定义
简化后的docker-compose
services: whoami: image: traefik/whoami labels: - traefik.enable=true - traefik.http.services.whoami.loadbalancer.server.port=80
动态配置文件路由定义
http: routers: whoami-http: entryPoints: [web] rule: Host(`whoami.local`) middlewares: [redirect-to-https] service: whoami whoami-https: entryPoints: [websecure] rule: Host(`whoami.local`) tls: true middlewares: [basic-auth] service: whoami middlewares: redirect-to-https: redirectScheme: scheme: https permanent: true basic-auth: basicAuth: users: - "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"
这种方式解决了traefik.enable=true生成的路由无法在动态配置中管理的问题——路由完全由动态配置文件控制,Docker仅提供服务实例。
3. 关键注意事项
- 确保Traefik静态配置中已正确声明
web(80端口)和websecure(443端口)入口点 - 动态配置文件需在Traefik静态配置中通过
providers.file指定加载路径 - 若容器不需要重定向,只需在路由配置中移除
redirect-to-https中间件即可
内容的提问来源于stack exchange,提问作者Mike Neverov
相关产品推荐
相关产品推荐

