如何通过Docker Compose的Traefik实现typersworld.com到www域名的路径重定向
解决方案:Traefik配置不带www到带www的域名重定向
以下是针对你的需求修改后的完整docker-compose.yaml配置,同时保留原有功能并实现指定的重定向规则:
version: '3.8' networks: backend-net: external: false volumes: letsencrypt: services: reverse-proxy: image: traefik:v3.1 command: - "--providers.docker" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.tlschallenge=true" - "--certificatesresolvers.myresolver.acme.email=bilalniamani001@gmail.com" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.web.http.redirections.entrypoint.scheme=https" - "--api=true" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock - letsencrypt:/letsencrypt networks: - backend-net frontend: image: bilawalnizamani/typing-game-frontend:latest env_file: - ./frontend.env init: true deploy: mode: replicated replicas: 2 networks: - backend-net depends_on: backend: condition: service_healthy labels: - "traefik.enable=true" # 原有带www的业务路由 - "traefik.http.routers.frontend.rule=Host(`www.typersworld.com`)" - "traefik.http.services.frontend.loadbalancer.server.port=3000" - "traefik.http.routers.frontend.entrypoints=websecure" - "traefik.http.routers.frontend.tls.certresolver=myresolver" - "traefik.http.routers.frontend.tls=true" # 新增不带www的域名捕获路由 - "traefik.http.routers.frontend-nonwww.rule=Host(`typersworld.com`)" - "traefik.http.routers.frontend-nonwww.entrypoints=web,websecure" - "traefik.http.routers.frontend-nonwww.tls.certresolver=myresolver" - "traefik.http.routers.frontend-nonwww.tls=true" # 重定向中间件(永久重定向,对SEO友好) - "traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https?://typersworld.com/(.*)" - "traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.typersworld.com/$1" - "traefik.http.middlewares.redirect-to-www.redirectregex.permanent=true" # 将中间件绑定到不带www的路由 - "traefik.http.routers.frontend-nonwww.middlewares=redirect-to-www" - "com.centurylinklabs.watchtower.enable=true" restart: always
配置说明
- 新增
frontend-nonwww路由:- 匹配所有访问
typersworld.com的HTTP/HTTPS请求 - 自动为
typersworld.com申请Let's Encrypt证书,确保HTTPS请求正常处理
- 匹配所有访问
redirect-to-www中间件:- 使用正则表达式捕获请求路径,将任意路径的请求永久重定向到带www的对应路径
permanent=true返回301状态码,符合SEO最佳实践
- 原有配置保留:继续维持HTTP到HTTPS的全局跳转,以及带www域名的业务路由功能
安全操作步骤(避免网站宕机)
- 备份当前配置文件:
cp docker-compose.yaml docker-compose.backup.yaml - 仅更新frontend服务(无需重启Traefik,减少中断风险):
docker-compose up -d --no-deps frontend - 等待2-3分钟,让ACME完成
typersworld.com的证书颁发 - 测试重定向效果:
正常情况下会看到301跳转至# 测试HTTP不带www跳转 curl -v http://typersworld.com/test-path # 测试HTTPS不带www跳转 curl -v https://typersworld.com/test-pathhttps://www.typersworld.com/test-path - 若出现异常,立即回滚配置:
cp docker-compose.backup.yaml docker-compose.yaml docker-compose up -d --no-deps frontend
内容的提问来源于stack exchange,提问作者Bilal Nizamani
相关产品推荐
相关产品推荐

