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

Traefik 2.9结合Docker:如何为单个服务配置非www转www重定向

解决方案

要实现仅针对这个Nginx服务将非www请求重定向到www,你需要在服务的Traefik标签里配置两个独立的路由:一个负责处理非www域名的重定向,另一个负责处理www域名的正常请求转发。

修改后的Nginx服务docker-compose.yml配置如下:

version: "3.9"

services:
  nginx:
    build: ./nginx
    volumes:
      - ./code:/code
    depends_on:
      - web
    labels:
      - "traefik.enable=true"
      # 路由1:匹配非www域名,触发重定向
      - "traefik.http.routers.ttt-redirect.rule=Host(`example.com`)"
      - "traefik.http.routers.ttt-redirect.entrypoints=websecure"
      - "traefik.http.routers.ttt-redirect.tls.certresolver=myresolver"
      - "traefik.http.routers.ttt-redirect.middlewares=ttt-www-redirect"
      # 重定向中间件:保留原路径和参数,跳转到www域名
      - "traefik.http.middlewares.ttt-www-redirect.redirectregex.regex=^https://example.com/(.*)"
      - "traefik.http.middlewares.ttt-www-redirect.redirectregex.replacement=https://www.example.com/$1"
      - "traefik.http.middlewares.ttt-www-redirect.redirectregex.permanent=true"
      # 路由2:匹配www域名,正常转发到服务
      - "traefik.http.routers.ttt.rule=Host(`www.example.com`)"
      - "traefik.http.routers.ttt.entrypoints=websecure"
      - "traefik.http.routers.ttt.tls.certresolver=myresolver"
      - "traefik.http.routers.ttt.service=ttt-service"
      # 定义服务指向Nginx容器内部端口(默认80,根据实际情况调整)
      - "traefik.http.services.ttt-service.loadbalancer.server.port=80"

networks:
  default:
    name: traefik-network

关键配置说明

  • ttt-redirect路由:专门捕获example.com的HTTPS请求,绑定重定向中间件处理跳转。
  • ttt-www-redirect中间件:使用正则匹配原请求路径,将域名替换为www.example.com,permanent=true设置301永久重定向,对搜索引擎更友好。
  • ttt路由:处理www.example.com的正常请求,通过定义的服务转发到Nginx容器内部端口。

由于你的Traefik已经配置了HTTP到HTTPS的全局重定向,所有http://example.com开头的请求会先被转到HTTPS,再触发上述服务级别的重定向,最终完全符合你要的跳转效果。

内容的提问来源于stack exchange,提问作者Philipp S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:27:08