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
相关产品推荐
相关产品推荐

