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

