如何使用PHP识别域名CNAME记录并将请求重定向至指定文档
PHP 检测访问域名CNAME记录并实现重定向方案
核心实现逻辑
整个流程分为三步:获取当前访问域名、查询域名CNAME记录、匹配规则后执行重定向。
具体实现代码
<?php // 1. 获取当前访问的域名,过滤非法字符避免注入风险 $currentHost = trim(strtolower($_SERVER['HTTP_HOST'])); // 2. 你预设的目标CNAME记录值,替换为自己实际需要匹配的CNAME地址 $targetCname = 'cname.example.com'; // 3. 匹配成功后的重定向目标地址 $redirectUrl = '/target-doc.html'; // 配置DNS查询缓存路径(可选,减少重复查询开销) $cacheDir = __DIR__ . '/dns_cache/'; $cacheFile = $cacheDir . md5($currentHost) . '.cache'; $cacheTtl = 3600; // 缓存有效期1小时 $cnameRecords = []; // 优先读取缓存 if (is_dir($cacheDir) && file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTtl) { $cnameRecords = json_decode(file_get_contents($cacheFile), true) ?: []; } else { // 无缓存时查询DNS的CNAME记录 $dnsResult = dns_get_record($currentHost, DNS_CNAME); if (!empty($dnsResult)) { foreach ($dnsResult as $record) { if (isset($record['target'])) { $cnameRecords[] = strtolower(trim($record['target'], '.')); } } } // 写入缓存 if (is_dir($cacheDir)) { file_put_contents($cacheFile, json_encode($cnameRecords)); } } // 匹配到目标CNAME则执行重定向 if (in_array($targetCname, $cnameRecords)) { header("Location: {$redirectUrl}", true, 302); exit; }
注意事项
- 根域名(比如
example.com)按照DNS规范通常不能设置CNAME记录,所以该方案主要适用于子域名场景 - 若服务器配置了hosts绑定对应域名,
dns_get_record会优先读取hosts配置,无法获取到公网的CNAME记录 - DNS查询存在延迟,建议一定要加缓存逻辑,避免每次请求都触发DNS查询拖慢响应速度
$_SERVER['HTTP_HOST']是用户请求头携带的内容,生产环境使用建议做白名单校验,避免伪造恶意请求
内容的提问来源于stack exchange,提问作者Peach Studio
相关产品推荐
相关产品推荐

