new URL() 解析的七个坑:443 端口消失、中文域名变 xn--、改一个参数整串被重编码
new URL()是浏览器和 Node 里解析链接最靠谱的办法比自己写正则强得多。但它是按 WHATWG URL 标准把地址「规范化」之后再给你的拿到的结果经常和你粘进去的那串字符不一样。下面这串地址我故意把几个容易出问题的地方都塞了进去https://例子.测试:443/docs/../api/v1 list?qabra%20b#top解析结果是这样的端口没了域名变成了一串xn--路径里的../不见了空格变成了%20和%20解出来都是空格。下面一个个说环境是 Chrome 154代码都可以直接贴到控制台跑。一、默认端口会被吞掉newURL(https://example.com:443/a).port// newURL(https://example.com:443/a).host// example.comnewURL(https://example.com:8443/a).port// 8443newURL(https://example.com:80/).port// 80协议的默认端口http 的 80、https 的 443会被去掉port返回空字符串href里也不再有:443。这会影响两类代码一是拿url.port判断「有没有指定端口」443 会被当成没写二是拿href和原始字符串做比较或者当缓存 keyhttps://a.com:443/x和https://a.com/x解析后是同一个href原始字符串却不相等。要拿端口号自己补默认值constporturl.port||({http::80,https::443})[url.protocol]||二、中文域名变成 xn-- 开头的 punycodenewURL(https://例子.测试/).hostname// xn--fsqu00a.xn--0zwm56d国际化域名在 URL 里统一用 punycode 表示。拿hostname去和配置里的中文域名比较永远不相等。做域名白名单时白名单本身也用new URL()解析一遍再比两边都是 punycode 就对上了。要把 punycode 显示回中文给用户看浏览器里没有直接的 APINode 可以用url.domainToUnicode()。顺带一提主机名会被转成小写HTTPS://ExAmple.COM/Path解析后是https://example.com/Path。路径保持原样大小写敏感与否由服务端决定。三、路径里的../、./和反斜杠会被规范化newURL(https://example.com/a/b/../c/./d).pathname// /a/c/dnewURL(https://example.com\\a\\b).pathname// /a/bnewURL(https://example.com/a b).pathname// /a%20b三个行为点段被折叠对 http/https 这类特殊协议反斜杠被当成斜杠空格这类字符被百分号编码。如果你在前端用pathname做路由匹配或者权限判断拿到的是规范化之后的结果和用户实际在地址栏里敲的不一样。服务端那边也会做自己的规范化两边规则不一定完全一致所以权限判断一定要放在服务端用服务端规范化后的路径做别依赖前端解析出来的样子。四、IP 地址的几种写法都会被转成点分十进制newURL(http://0x7f.1/).hostname// 127.0.0.1newURL(http://2130706433/).hostname// 127.0.0.1十六进制、省略段、整数形式的 IPv4 都会被转成标准的127.0.0.1。这一条主要提醒做「禁止访问内网地址」校验的场景拿原始字符串做黑名单匹配是挡不住的要先解析再对解析后的hostname判断。更稳妥的做法是在服务端解析域名拿到真实 IP 之后再判断因为域名本身也可能解析到内网地址。五、相对地址直接抛异常base 末尾有没有斜杠结果不同newURL(/api/user)// TypeError: Invalid URLnewURL(example.com/path)// TypeError: Invalid URL没写协议也不行new URL()只接受绝对地址。相对地址要传第二个参数 basenewURL(b,https://x.com/a).href// https://x.com/bnewURL(b,https://x.com/a/).href// https://x.com/a/bnewURL(/b,https://x.com/a/).href// https://x.com/bnewURL(//cdn.com/x.js,https://x.com/a).href// https://cdn.com/x.js前两行只差 base 末尾一个斜杠结果差了一级目录拼 API 地址时这是很常见的 bug。最后一行是协议相对地址会直接换掉主机。想先判断能不能解析、又不想写 try/catch新一点的环境有URL.canParse()URL.canParse(/x)// falseURL.canParse(/x,https://a.com)// true六、searchParams 读的时候把当空格改一个参数会重写整串constunewURL(https://x.com/s?qabra%20btc%2Bd)u.searchParams.get(q)// a bu.searchParams.get(r)// a bu.searchParams.get(t)// cdsearchParams按application/x-www-form-urlencoded规则解析和%20都是空格真正的加号要写成%2B。截图里的查询参数表也是这样q和r显示的都是a b。更隐蔽的是写操作u.searchParams.set(n,1)u.search// ?qabrabtc%2Bdn1我只加了一个n原来的ra%20b却变成了rab。只要动了searchParams整个查询串都会按它的规则重新序列化一遍。大多数服务端把两者都当空格没问题但如果对方要拿原始查询串算签名很多开放平台的接口签名都是这么做的签名就对不上了。这种场景别用searchParams改直接拼字符串或者签名在最后一步、对最终的字符串算。七、空的#和?读出来是空字符串但 href 里还在constanewURL(https://x.com/a#)a.hash// a.href// https://x.com/a#hash和search为空字符串时分不清是「没有」还是「有个空的」href里却保留了那个符号。拿url.hash 判断「链接里没有锚点」是不严谨的要区分的话只能看原始字符串。另外两个小点mailto:ab.com这种非特殊协议hostname是空的内容全在pathname里origin对mailto:是字符串null对file:在 Chrome 里是file://不同浏览器不完全一致别拿它做安全判断。最后整理成一句话new URL()给你的是规范化之后的地址凡是要拿它做比较、做白名单、做签名的地方都要想清楚比的是规范化前还是规范化后。平时排查一个可疑链接我会直接丢进 福兮的 URL 解析工具 看一眼上面那张截图就是它内部用的就是浏览器原生的URL所以看到的和你代码里拿到的一致查询参数也会按searchParams的规则拆成表格。局限也是同一个它只展示规范化之后的结果不会提示你哪些地方被改过比如端口被吞、%20被解码这些得自己对着原串看相对地址它也解析不了会直接判为无效。你在项目里被new URL()坑过吗

相关新闻

不止是功能堆砌!Paperxie 凭借学术综合思维力,打造毕设全链路一体化解决方案

不止是功能堆砌!Paperxie 凭借学术综合思维力,打造毕设全链路一体化解决方案

前言 很多 AI 工具只是 “单点任务执行者”,你下达什么指令,它就输出对应的文字、图表,缺少跨环节的全局学术思维。 通用大模型只能单独处理一句话、一段文字,割裂开题、文献、正文、参考文献之间的逻辑关联。经常出现一个致命问…

2026/10/7 8:10:03 阅读更多 →
临安隐形矫正选择先对比方案费用

临安隐形矫正选择先对比方案费用

有牙齿矫正需求的临安本地用户,面对不同口腔机构往往会陷入选择困惑,在考虑隐形矫正时,除了对比方案和费用,机构的专业资质、医生团队配置也是核心参考维度,本文结合本地机构情况梳理相关参考信息。机构资质与团队背景…

2026/10/7 8:10:03 阅读更多 →
Claw3D技能开发指南:5步从零创建并上架你的第一个Office Skill

Claw3D技能开发指南:5步从零创建并上架你的第一个Office Skill

Claw3D技能开发指南:5步从零创建并上架你的第一个Office Skill 【免费下载链接】Claw3D Claw3D is an open source 3D engine built on OpenClaw for creating games, simulations, and high-performance 3D applications. 项目地址: https://gitcode.com/gh_mirr…

2026/10/7 8:09:02 阅读更多 →

最新新闻

humanizer如何让改写不失真?SFT+DPO+GRPO训练流水线完整拆解(全程不用AI检测器)

humanizer如何让改写不失真?SFT+DPO+GRPO训练流水线完整拆解(全程不用AI检测器)

humanizer如何让改写不失真?SFTDPOGRPO训练流水线完整拆解(全程不用AI检测器) 【免费下载链接】humanizer 项目地址: https://ai.gitcode.com/hf_mirrors/jialinyyzz/humanizer humanizer 是一个 12B 参数的本地 AI 文本改写模型&…

2026/10/7 8:36:19 阅读更多 →
基于RAG技术的校园智能迎新咨询系统设计与实现

基于RAG技术的校园智能迎新咨询系统设计与实现

一、研究背景与意义每年9月迎新季是高校工作的高峰期。据教育部统计,2023年全国普通高校招生录取人数超过1000万人,新生入学咨询量呈爆发式增长。迎新期间,新生及家长关于报到流程、宿舍安排、缴费方式、校园设施、专业培养等问题的咨询量巨大…

2026/10/7 8:36:19 阅读更多 →
华为鸿蒙免费口算练习APP—小羊口算

华为鸿蒙免费口算练习APP—小羊口算

晚饭后孩子摊开口算本,写两道就开始磨铅笔。我去翻口算工具,不是先弹广告,就是把题锁在会员后面——手刚伸出去,兴致就没了。我想做一款打开就能练的:对错马上看见;练到一半被叫去洗碗,回来还能…

2026/10/7 8:36:19 阅读更多 →
WeXPort 微信聊天记录导出攻略指南:6 类职业场景一次讲清

WeXPort 微信聊天记录导出攻略指南:6 类职业场景一次讲清

前言微信聊天记录,对不同职业的人来说,价值完全不一样。微商靠它留客户承诺,法务靠它当证据,财务靠它对账,HR 靠它做交接,内容创作者靠它攒素材,普通打工人靠它留工作记录。但微信记录有一个特点…

2026/10/7 8:36:19 阅读更多 →
好靶场:逻辑漏洞-越权漏洞

好靶场:逻辑漏洞-越权漏洞

⚠️ 免责声明:本文所有操作仅在【好靶场】官方授权的线上安全练习靶场中完成,仅用于网络安全原理学习、技术研究。 严禁将文中Payload、漏洞利用方法应用到任何未获得授权的公网服务器、网站。 未经授权对网站进行渗透测试属于违法行为,一切…

2026/10/7 8:36:19 阅读更多 →
铝电解电容选型设计规范

铝电解电容选型设计规范

前言文档版本:V1.0编制目的:规范铝电解电容器选型、电路设计、降额设计、PCB布局及可靠性验证,明确寿命、纹波电流、温度、反压等关键限制,规避鼓包漏液、容量衰减、ESR上升、爆炸失效等风险。适用范围:直插有极性铝电…

2026/10/7 8:35:19 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →