自定义域名的On Demand TLS与反向代理路径转发问题
解决方案:Caddy实现带路径映射的反向代理
Caddy 原生配置方案(无需额外插件)
你可以通过正则捕获请求域名 + 路径重写的组合,实现自定义域名到指定后端路径的反向代理,完美适配你的需求。以下是具体的Caddyfile配置:
{ # 可选但推荐:配置On-Demand TLS的域名验证接口,防止恶意滥用 on_demand_tls { ask http://my-app.com/api/validate-domain } } # 你的CNAME目标域名 status.myserver.com { tls { on_demand } # 匹配符合格式的自定义域名(如status.google.com),并提取站点标识(如google) @matchCustomHost host_regexp ^status\.([^\.]+)\.com$ # 重写请求路径:将原路径(如/或/uptime)替换为/status-page/{站点标识}/原路径 rewrite @matchCustomHost /status-page/{re.host.1}{uri} # 反向代理到my-app.com reverse_proxy my-app.com { # 可选:传递原请求的Host头给后端(如果my-app.com需要根据该域名做验证) header_up Host {host} # 若后端不需要原Host,可替换为:header_up Host {upstream_hostport} } }
配置说明:
host_regexp规则:通过正则^status\.([^\.]+)\.com$捕获自定义域名中的站点标识(比如status.google.com中的google会被存在{re.host.1}变量里)。rewrite规则:将用户的请求路径(比如访问status.google.com/uptime)重写为/status-page/google/uptime,确保后端能正确路由。- On-Demand TLS 验证:
ask指向的接口需要接收?domain=xxx参数,返回200表示该域名已在你的系统中绑定,4xx则拒绝签发证书,避免被恶意域名滥用。
灵活适配非固定格式域名
如果用户的自定义域名格式不统一(比如有的用my-status.google.io),正则捕获无法覆盖,你可以:
- 在
my-app.com中存储自定义域名与站点标识的映射关系。 - 用Caddy的
http.request.vars插件或自定义中间件,在请求时调用内部API获取当前域名对应的站点路径,再动态重写。不过这种方式需要额外开发,建议优先约定域名格式简化实现。
替代工具:Nginx
如果你考虑更换工具,Nginx同样可以实现需求,且正则处理更灵活,只是On-Demand TLS需要依赖acme.sh或certbot的自动签发脚本:
server { listen 80; listen 443 ssl; server_name status.myserver.com; # 配置SSL证书自动签发(需结合acme.sh等工具) ssl_certificate /path/to/auto/cert; ssl_certificate_key /path/to/auto/key; # 从自定义域名中提取站点标识 if ($host ~* ^status\.([^\.]+)\.com$) { set $site_id $1; } location / { # 重写路径到后端指定位置 rewrite ^/(.*)$ /status-page/$site_id/$1 break; proxy_pass http://my-app.com; # 传递原Host头给后端 proxy_set_header Host $host; } }
注意事项
- 确保
my-app.com的路由系统能正确处理/status-page/{site_id}的请求,且可以验证请求的Host头是否与站点绑定,防止未授权访问。 - On-Demand TLS的验证接口必须配置,否则可能被恶意域名攻击,导致CA限制你的证书签发权限。
内容的提问来源于stack exchange,提问作者Dipesh KC
相关产品推荐
相关产品推荐

