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

如何在NodeJS中为URL字符串添加www子域名(仅当无现有子域名时)

在Node.js中为无任何子域名的URL添加www子域名

我来给你分享一个实用的Node.js实现方案,完全满足你要求的只给原本没有任何子域名的URL添加www的需求,而且用内置模块就搞定,不用额外装依赖~

核心实现代码

我们可以利用Node.js内置的url模块里的URL类来解析和修改URL,这样比自己写正则要靠谱得多,不容易踩坑:

const { URL } = require('url');

function addWwwIfNoSubdomain(urlString) {
  // 处理不带协议的输入,先临时补协议方便解析
  let parsedUrl;
  try {
    parsedUrl = new URL(urlString);
  } catch {
    // 没有协议的话默认补http://,解析后再还原
    parsedUrl = new URL(`http://${urlString}`);
  }

  // 拆分主机名为数组,判断子域名情况
  const hostnameParts = parsedUrl.hostname.split('.');
  
  // 核心逻辑:仅当主机名是两段(比如facebook.com)时添加www
  // 多段(如developers.facebook.com)或单段(如localhost)则保持原样
  if (hostnameParts.length === 2) {
    parsedUrl.hostname = `www.${parsedUrl.hostname}`;
  }

  // 还原回原输入的格式:如果原URL不带协议,就只返回主机名+路径
  if (!urlString.startsWith('http')) {
    return parsedUrl.hostname + parsedUrl.pathname;
  }
  // 带协议的话返回完整URL字符串
  return parsedUrl.toString();
}

测试用例验证

咱们用你给的例子和一些额外场景测试下:

// 测试你的示例输入
console.log(addWwwIfNoSubdomain('https://facebook.com/')); 
// 输出:https://www.facebook.com/

console.log(addWwwIfNoSubdomain('facebook.com')); 
// 输出:www.facebook.com

console.log(addWwwIfNoSubdomain('https://developers.facebook.com/')); 
// 输出:https://developers.facebook.com/(不修改)

// 额外测试场景
console.log(addWwwIfNoSubdomain('localhost')); 
// 输出:localhost(单段域名不添加)

console.log(addWwwIfNoSubdomain('https://blog.example.co.uk/')); 
// 输出:https://blog.example.co.uk/(多段主机名不修改)

补充:处理多段顶级域名的特殊情况

如果你的业务中会遇到co.uk、com.au这类多段顶级域名,比如example.co.uk(主机名是3段,但example才是子域名),当前逻辑已经能正确识别不修改;但如果是co.uk这种纯顶级域名(很少见),会被添加成www.co.uk。如果要排除这类情况,可以加个多段顶级域名白名单:

const { URL } = require('url');

// 可根据业务需求扩展这个白名单
const multiPartTlds = new Set(['co.uk', 'com.au', 'org.uk', 'net.au']);

function addWwwIfNoSubdomain(urlString) {
  let parsedUrl;
  try {
    parsedUrl = new URL(urlString);
  } catch {
    parsedUrl = new URL(`http://${urlString}`);
  }

  const hostnameParts = parsedUrl.hostname.split('.');
  
  // 先判断是否是多段顶级域名,再决定是否添加www
  if (hostnameParts.length === 2) {
    const domain = hostnameParts.join('.');
    if (!multiPartTlds.has(domain)) {
      parsedUrl.hostname = `www.${parsedUrl.hostname}`;
    }
  }

  if (!urlString.startsWith('http')) {
    return parsedUrl.hostname + parsedUrl.pathname;
  }
  return parsedUrl.toString();
}

这样co.uk这类多段顶级域名就不会被添加www啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:32:19