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.
相关产品推荐
相关产品推荐

