Traefik配置www转非www重定向时出现404错误求助
问题分析与解决
访问www.example.com返回404的核心原因是:没有任何Traefik路由器匹配www.example.com这个域名。你当前的wordpress路由器仅匹配非www的${ENV_HOST}域名,当请求www域名时,Traefik找不到对应的路由规则,直接返回404,此时你配置的redirect-www中间件根本没有机会执行。
解决方案
方案1:修改现有路由器规则,同时匹配www与非www域名
修改wordpress服务的traefik.http.routers.wordpress.rule标签,让它同时匹配两个域名:
labels: - "traefik.enable=true" - "traefik.http.routers.wordpress.tls=true" - "traefik.http.routers.wordpress.entrypoints=https" - "traefik.http.routers.wordpress.middlewares=redirect-www@file" - "traefik.http.routers.wordpress.rule=Host(`${ENV_HOST}`, `www.${ENV_HOST}`)"
这样,无论是访问非www还是www域名,都会匹配到这个路由器,然后通过redirect-www中间件将www请求重定向到非www地址。
方案2:新增独立的www域名路由器
给wordpress服务添加额外的标签,创建一个专门匹配www域名的路由器,同样应用重定向中间件:
labels: - "traefik.enable=true" # 原有非www路由器配置 - "traefik.http.routers.wordpress.tls=true" - "traefik.http.routers.wordpress.entrypoints=https" - "traefik.http.routers.wordpress.middlewares=redirect-www@file" - "traefik.http.routers.wordpress.rule=Host(`${ENV_HOST}`)" # 新增www路由器配置 - "traefik.http.routers.wordpress-www.tls=true" - "traefik.http.routers.wordpress-www.entrypoints=https" - "traefik.http.routers.wordpress-www.middlewares=redirect-www@file" - "traefik.http.routers.wordpress-www.rule=Host(`www.${ENV_HOST}`)" - "traefik.http.routers.wordpress-www.service=wordpress@docker"
这个方案将两个域名的路由规则分开,但最终都指向同一个WordPress服务,并执行重定向逻辑。
额外注意事项
检查你的redirect-www中间件正则表达式:在YAML配置中,双引号内的反斜杠需要转义,否则可能导致正则解析异常。建议将中间件的正则部分修改为:
http: middlewares: redirect-www: redirectRegex: regex: "^(https:\\/\\/)?www\\.(.+)" replacement: "https://${2}" permanent: true
内容的提问来源于stack exchange,提问作者Jimmy Adaro
相关产品推荐
相关产品推荐

