使用Traefik将裸域名重定向至www域名的问题排查
问题原因及解决方案
你的问题出在重定向中间件的正则表达式上——原来的规则会匹配所有域名(包括已带www前缀的),然后统一给捕获到的内容再加上www,导致www.example.com被处理成www.www.example.com。
修复步骤:修改重定向中间件的正则规则
把中间件的正则改成只匹配不带www前缀的裸域名,同时保留原请求的路径和参数:
traefik: image: traefik # ... labels: # 仅匹配无www前缀的域名,捕获域名主体和后续路径 traefik.http.middlewares.nakedtowww.redirectregex.regex: ^https?://(?!www\\.)([^/]+)(.*) # 替换为带www的域名,拼接原路径/参数 traefik.http.middlewares.nakedtowww.redirectregex.replacement: https://www.$1$2 traefik.http.middlewares.nakedtowww.redirectregex.permanent: true
原理说明
(?!www\\.)是负向前瞻断言,确保当前位置的域名不是以www.开头的,避免重复处理带www的请求([^/]+)捕获裸域名(比如example.com),(.*)捕获域名后的路径、查询参数等内容- 替换规则
https://www.$1$2会把裸域名加上www.前缀,同时完整保留原请求的路径和参数
验证效果
- 访问
https://example.com或https://example.com/test?foo=bar,会自动重定向到https://www.example.com或https://www.example.com/test?foo=bar - 直接访问
https://www.example.com不会触发重定向,可正常访问服务
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

