如何在Traefik中实现从指定端口到域名的重定向(Docker Swarm模式)
解决Traefik在Docker Swarm中实现端口到域名的重定向问题
我看了你的配置,问题出在两个关键点上:一是Traefik没有明确监听8443端口的请求,二是没有专门的Router来捕获这个端口的portainer.com访问,导致你的重定向中间件根本没机会处理8443端口的请求。下面是具体的调整方案:
步骤1:给Traefik添加8443端口的Entrypoint
首先需要让Traefik知道要处理8443端口的流量,在Traefik服务的command字段里新增一个Entrypoint配置:
command: - --providers.docker - --providers.docker.swarmMode=true - --providers.docker.exposedbydefault=false - --entrypoints.http.address=:80 - --entrypoints.https.address=:443 # 新增8443端口的Entrypoint,启用TLS - --entrypoints.https-alt.address=:8443 - --entrypoints.https-alt.http.tls=true - --certificatesresolvers.le.acme.email=port@port.com - --certificatesresolvers.le.acme.storage=/certificates/acme.json - --certificatesresolvers.le.acme.httpchallenge=true - --certificatesresolvers.le.acme.httpchallenge.entrypoint=http - --accesslog - --log - --api
步骤2:为Portainer配置专门的8443端口Router
接下来需要创建一个Router,专门匹配来自8443端口的portainer.com请求,并应用重定向中间件。同时优化重定向正则,确保能匹配根路径和带路径的请求:
portainer: # ... 其他配置不变 ... labels: - "traefik.enable=true" # 原有的443端口Router配置(保留不变) - "traefik.http.routers.portainer.service=portainer" - "traefik.http.routers.portainer.rule=Host(`portainer.com`)" - "traefik.http.routers.portainer.entrypoints=https" - "traefik.http.services.portainer.loadbalancer.server.port=9000" - "traefik.http.routers.portainer.tls=true" - "traefik.http.routers.portainer.tls.certresolver=le" - "traefik.docker.network=traefik_net" # 优化重定向正则:匹配8443端口的任何路径(包括根路径),并保留原路径 - "traefik.http.middlewares.portainer-redirect.redirectregex.regex=^https?://portainer.com:8443(/.*)?$" - "traefik.http.middlewares.portainer-redirect.redirectregex.replacement=https://portainer.com$1" - "traefik.http.middlewares.portainer-redirect.redirectregex.permanent=true" # 新增Router处理8443端口的请求 - "traefik.http.routers.portainer-8443.entrypoints=https-alt" - "traefik.http.routers.portainer-8443.rule=Host(`portainer.com`)" - "traefik.http.routers.portainer-8443.tls=true" - "traefik.http.routers.portainer-8443.tls.certresolver=le" - "traefik.http.routers.portainer-8443.middlewares=portainer-redirect"
为什么这样改能生效?
- Entrypoint配置:Traefik只会处理配置了Entrypoint的端口请求,新增
https-altEntrypoint后,Traefik才会监听8443端口并处理TLS流量。 - 专门的Router:新增的
portainer-8443Router会精准捕获来自8443端口的portainer.com请求,然后触发重定向中间件。 - 优化正则:调整后的正则表达式可以匹配
https://portainer.com:8443(根路径)和https://portainer.com:8443/xxx(带路径)的请求,并且会把原路径保留到重定向后的地址中,避免丢失路径信息。
调整完成后,重新部署你的Stack:
docker stack deploy -c your-compose-file.yml your-stack-name
等Traefik和Portainer服务更新完成后,访问https://portainer.com:8443就会自动重定向到https://portainer.com了。
内容的提问来源于stack exchange,提问作者shapale
相关产品推荐
相关产品推荐

