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

PHP如何检测网站带www或不带www时是否可正常访问

PHP校验域名www/非www版本可达性实现方案

核心思路是先清洗用户输入的非标准URL,提取出纯净主域名后,分别对两个版本的地址发起实际HTTP请求验证可达性,避免仅靠DNS解析造成的误判。

核心处理流程

  • 输入清洗:剥离用户输入URL里的协议头(http/https)、路径参数、端口、末尾斜杠、已有的www前缀,拿到纯净的根域名
  • 测试地址构造:基于根域名分别生成带www、不带www的两个HTTPS测试地址(HTTPS检测失败时可降级检测HTTP)
  • 可达性检测:通过CURL发起轻量请求,自动跟随301/302跳转,判断最终返回的HTTP状态码是否为200正常区间
  • 结果输出:明确返回两个版本地址各自是否可正常访问,可直接用于表单提交后的校验提示、自动修正用户输入

可直接复用的代码示例

/**
 * 清洗URL提取纯净根域名
 */
function cleanDomain(string $inputUrl): string {
    // 去掉协议头
    $domain = preg_replace('/^https?:\/\//i', '', trim($inputUrl));
    // 去掉路径、参数、端口
    $domain = parse_url('http://' . $domain, PHP_URL_HOST);
    // 去掉开头的www前缀
    $domain = preg_replace('/^www\./i', '', $domain);
    return strtolower(trim($domain, '/'));
}

/**
 * 检测单个URL是否可正常访问
 */
function checkUrlReachable(string $url): bool {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_NOBODY => true, // 发HEAD请求,减少传输量
        CURLOPT_FOLLOWLOCATION => true, // 自动跟随跳转
        CURLOPT_CONNECTTIMEOUT => 3, // 连接超时3秒
        CURLOPT_TIMEOUT => 5, // 总超时5秒
        CURLOPT_SSL_VERIFYPEER => true, // 校验SSL证书合法性
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        CURLOPT_HTTPHEADER => ['Accept: */*']
    ]);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    // 状态码200-399都算可正常访问(包含正常跳转的场景)
    return $httpCode >= 200 && $httpCode < 400;
}

// 业务调用示例
$userInput = $_POST['website_url'] ?? '';
$rootDomain = cleanDomain($userInput);
if (empty($rootDomain)) {
    // 域名格式非法的提示逻辑
    exit('请输入合法的网站地址');
}

$checkResult = [
    'non_www' => checkUrlReachable('https://' . $rootDomain),
    'www' => checkUrlReachable('https://www.' . $rootDomain)
];

// 如果HTTPS检测全失败,降级测HTTP
if (!$checkResult['non_www'] && !$checkResult['www']) {
    $checkResult['non_www'] = checkUrlReachable('http://' . $rootDomain);
    $checkResult['www'] = checkUrlReachable('http://www.' . $rootDomain);
}

// 后续根据结果做逻辑处理:比如提示用户输入的www版本无法访问,或者自动修正为可访问的版本

关键注意事项

  • 不要仅用gethostbyname()判断DNS解析:不少域名做了www的解析记录,但Web服务没配置对应站点,访问会返回404或默认页面,必须实际发起HTTP请求才准确
  • 超时时间必须设置:外网请求存在不可控性,不设置超时会导致PHP进程卡住,影响表单提交响应速度
  • HEAD请求兼容处理:部分站点会拦截HEAD请求,遇到检测结果全失败的场景,可以把CURLOPT_NOBODY设为false,同时加CURLOPT_RANGE => '0-1'配置只取第一个字节的数据,兼顾兼容性和性能
  • 自动跳转场景处理:很多站点会把www域名301跳转到非www域名(或反过来),代码里开启了跟随跳转,只要最终能正常打开就算可访问,符合普通用户的实际访问体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:01:21