如何将动态泛子域名指向其他服务器对应路径且不触发重定向
实现方案
前置说明
DNS解析仅负责域名到IP的映射,无法处理HTTP层的路径转换逻辑,因此你需要的无重定向动态映射必须依赖HTTP反向代理实现,所有方案都需要先完成第一步DNS配置:将*.example.com的A/AAAA记录解析到你用于代理的服务器/CDN节点IP。
方案1:Nginx反向代理实现
这是最常用的自建服务方案,配置简单性能高:
- 确保你的服务器已安装Nginx
- 新增/修改Nginx站点配置,示例如下:
server { listen 80; # 如需HTTPS则新增listen 443 ssl配置,搭配你的SSL证书即可 server_name *.example.com; # 提取子域名部分存入变量 if ($host ~* ^(?<subdomain>.+)\.example\.com$) { set $target_path $subdomain; } location / { # 第三方服务如果是HTTPS协议,proxy_pass前缀换成https即可 proxy_pass http://someoneElseServer.com/$target_path$request_uri; # 重写Host头为第三方域名,避免第三方服务因Host校验不通过返回错误 proxy_set_header Host someoneElseServer.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关闭自动重定向修正,避免暴露第三方源站域名 proxy_redirect off; } }
如果你不需要保留子域名后的请求路径,只需要访问
A.example.com映射到someoneElseServer.com/A,把配置里的$request_uri删掉即可。
- 重载Nginx配置生效。
方案2:Apache反向代理实现
如果你的服务器用的是Apache,也可以通过代理模块实现:
- 先开启所需依赖模块:
a2enmod proxy proxy_http rewrite
- 新增虚拟主机配置,示例如下:
<VirtualHost *:80> ServerName example.com ServerAlias *.example.com # 如需HTTPS则配置443端口及SSL证书参数 RewriteEngine On # 匹配子域名部分 RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$ [NC] # P标记表示走代理转发而非重定向,L表示匹配后停止后续规则 RewriteRule ^(.*)$ http://someoneElseServer.com/%1$1 [P,L] ProxyPassReverse / http://someoneElseServer.com/ </VirtualHost>
- 重载Apache配置生效。
方案3:CDN边缘规则实现(免自建服务器)
如果你不想自己维护代理服务器,可以用支持边缘重写规则的CDN服务实现:
- 将
*.example.com接入对应CDN服务,回源地址设置为someoneElseServer.com - 新增边缘重写规则:提取请求Host的子域名部分,将回源路径改写为
/{子域名}{原始请求路径} - 开启回源Host重写,设置回源Host为
someoneElseServer.com
配置完成后CDN会自动完成代理转发,访问者全程看不到第三方域名,完全符合无重定向指向的要求。
注意事项
如果第三方服务配置了防盗链、IP白名单限制,需要提前将你的代理服务器IP/CDN回源节点IP加入第三方的放行名单,否则会出现访问失败的问题。
内容的提问来源于stack exchange,提问作者Aiman
相关产品推荐
相关产品推荐

