You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

为什么这样改能生效?

  1. Entrypoint配置:Traefik只会处理配置了Entrypoint的端口请求,新增https-alt Entrypoint后,Traefik才会监听8443端口并处理TLS流量。
  2. 专门的Router:新增的portainer-8443 Router会精准捕获来自8443端口的portainer.com请求,然后触发重定向中间件。
  3. 优化正则:调整后的正则表达式可以匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:28:13