Traefik配置:允许用户通过CNAME自定义域名访问Docker后端服务
解决Traefik允许CNAME访问的404问题
首先,你碰到的404问题核心原因很明确:你用的是Traefik v1版本,当前配置的路由规则只认sub.example.com这个Host头,但用户通过sub.usera.com访问时,请求带的Host头是sub.usera.com,完全不匹配规则,所以Traefik找不到对应的后端服务,直接返回了404。
下面是一步步的解决办法:
1. 更新Traefik路由规则,匹配多域名
你需要修改docker-compose.yml里服务的traefik.frontend.rule标签,让它同时兼容你的原始域名和用户的CNAME域名:
traefik.frontend.rule=Host:sub.example.com,sub.usera.com
如果有多个用户需要添加自定义域名,直接用逗号分隔追加即可。
进阶:支持任意CNAME域名(谨慎使用)
要是想允许所有CNAME到sub.example.com的域名访问,可以用HostRegexp规则匹配任意Host头:
traefik.frontend.rule=HostRegexp:{host:.+}
⚠️ 注意:这种方式会把所有指向Traefik的请求都路由到这个服务,只适合单服务场景,或者你能确保不会和其他服务的路由冲突。
2. 验证配置生效
修改完docker-compose.yml后,重启服务和Traefik:
docker-compose down && docker-compose up -d
然后查看Traefik日志,确认新的路由规则已经加载:
docker logs <你的traefik容器名称>
日志里应该能看到包含sub.example.com和sub.usera.com的前端规则记录。
3. 检查DNS解析与请求头
- 先用
nslookup确认用户的CNAME解析正常:
要确保返回的IP是你的Traefik服务器IP(也就是nslookup sub.usera.comsub.example.com对应的IP)。 - 用curl测试请求,确认Host头正确传递:
在输出里找curl -v http://sub.usera.comHost: sub.usera.com这一行,确保Traefik收到的是正确的Host头。
4. 确认Docker网络配置
要保证你的服务和Traefik都加入了http_network这个Docker网络:
- 查看Traefik的网络信息:
docker inspect <你的traefik容器名称> | grep Networks - 查看你的服务的网络信息:
两者都必须包含docker inspect <你的应用服务容器名称> | grep Networkshttp_network,否则容器间的请求没法正常传递。
5. 复查Web应用的域名限制
虽然你说Web应用已经处理了主机重定向,但还是要确认应用本身是否允许sub.usera.com作为合法域名访问。不少应用有域名白名单机制,哪怕Traefik把请求传过去了,应用也可能直接拒绝或返回错误。
内容的提问来源于stack exchange,提问作者gamalan
相关产品推荐
相关产品推荐

