PHP脚本域名与域名服务器校验功能异常求助
问题诊断
核心问题出在PHP代码的DNS校验触发逻辑上:
处理POST请求时,你先执行了这段代码将$domain替换为用户输入的自定义域名:
if ($domain === 'custom') { $domain = $_POST['customDomain']; }
后续再用if ($domain === 'custom')判断是否需要校验DNS时,这个条件永远为false(除非用户输入的自定义域名恰好是custom),导致DNS校验逻辑完全没有执行,系统直接返回OK并跳转。
解决方案
改用原始的POST参数判断是否为自定义域名,而非替换后的$domain变量。同时修正原DNS校验逻辑——原逻辑只要找到一个正确NS就通过,建议改为要求两个指定NS都配置完成,符合业务需求。
修正后的PHP代码
function isDomainAvailable($domain) { $fullUrl = $domain; if (!filter_var($fullUrl, FILTER_VALIDATE_URL)) { return false; } $curlInit = curl_init($fullUrl); curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curlInit, CURLOPT_HEADER, true); curl_setopt($curlInit, CURLOPT_NOBODY, true); curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, true); curl_setopt($curlInit, CURLOPT_FOLLOWLOCATION, true); // 处理重定向避免误判 $response = curl_exec($curlInit); curl_close($curlInit); return $response !== false; } function is_valid_domain_name($domain_name) { return (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) // 修复正则点未转义问题 && preg_match("/^.{1,253}$/", $domain_name) && preg_match("/^[^.]{1,63}(\.[^.]{1,63})*$/", $domain_name) ); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $subdomain = trim($_POST['subdomain']); $originalDomain = $_POST['domain']; // 保存原始domain参数用于判断 $domain = $originalDomain; if ($originalDomain === 'custom') { $domain = trim($_POST['customDomain']); } if (!is_valid_domain_name($domain)) { echo "Error: Invalid domain name."; exit; } // 处理空subdomain场景 $fullDomain = $subdomain ? $subdomain . '.' . $domain : $domain; if (isDomainAvailable('https://' . $fullDomain)) { echo "Error: Subdomain already exists."; exit; } // 用原始参数判断是否触发DNS校验 if ($originalDomain === 'custom') { $dnsRecords = dns_get_record($domain, DNS_NS); if (empty($dnsRecords)) { echo "Error: No nameserver records found for the domain."; exit; } $correctNameservers = ['ns11.webshineglobal.xyz', 'ns12.webshineglobal.xyz']; $foundNameservers = []; foreach ($dnsRecords as $record) { // 去除DNS记录末尾可能存在的点 $target = rtrim($record['target'], '.'); if (in_array($target, $correctNameservers)) { $foundNameservers[] = $target; } } // 确保两个指定NS都已配置 if (count(array_unique($foundNameservers)) !== 2) { echo "Error: Please set your nameservers to ns11.webshineglobal.xyz and ns12.webshineglobal.xyz."; exit; } } echo "OK"; exit; }
额外优化点
- 修复
is_valid_domain_name函数正则表达式中点未转义的问题。 - 在
isDomainAvailable中添加重定向跟随,避免因域名重定向导致的可用性误判。 - 增加空DNS记录判断,避免无记录时进入无效循环。
- 对所有输入参数做
trim()处理,过滤首尾空格。
内容的提问来源于stack exchange,提问作者user22606410
相关产品推荐
相关产品推荐

