You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}
额外优化点
  1. 修复is_valid_domain_name函数正则表达式中点未转义的问题。
  2. 在isDomainAvailable中添加重定向跟随,避免因域名重定向导致的可用性误判。
  3. 增加空DNS记录判断,避免无记录时进入无效循环。
  4. 对所有输入参数做trim()处理,过滤首尾空格。

内容的提问来源于stack exchange,提问作者user22606410

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:24:50