ToolDeck

URL 解析器

将 URL 拆解为各个组成部分——协议、主机、路径、查询参数、哈希

加载示例

什么是 URL 解析?

URL 解析是将统一资源定位符(URL)拆分为各个组成部分的过程,包括协议(scheme)、主机名、端口、路径、查询参数和片段标识符。每个 URL 都遵循 RFC 3986 和 WHATWG URL 标准所定义的结构。URL 解析器读取原始字符串,通过定界符(://、:、/、?、#、&、=)识别各段,并将其作为独立的可访问字段返回。

浏览器在每次输入地址或点击链接时都会执行 URL 解析。JavaScript 的 URL 构造函数、Python 的 urllib.parse 模块以及 Go 的 net/url 包都实现了遵循相同结构规则的解析器。解析 URL 是 URL 编码的逆过程:不是将字符转换为安全传输格式,而是将已构成的 URL 分解为各组成部分。

一个典型的 URL,如 https://api.example.com:8080/v1/users?page=2&limit=10#section,包含六个独立组成部分。定界符——://、:、/、?、&、= 和 #——使解析具有确定性:每个定界符标志着一个边界,使解析器能够无歧义地提取各字段。

为什么使用在线 URL 解析器?

手动拆分 URL 容易出错,尤其是当字符串中包含编码字符、多个查询参数或非标准端口时。本工具使用与浏览器相同的符合 WHATWG 标准的算法解析 URL,并以清晰、可复制的表格展示每个组成部分。

在浏览器中即时解析
粘贴任意 URL,立即查看所有组成部分的拆解结果。无需刷新页面,无需服务器请求,无需等待。
🔒
保护您的 URL 隐私
解析完全在浏览器中使用原生 URL API 运行。您输入的 URL 不会离开您的设备。
🔍
检查每个细节
查看协议、主机名、端口、路径、查询字符串、哈希,以及每个独立查询参数及其解码后的值。
📋
复制单个组成部分
点击任意字段旁的复制按钮,精确获取该字段的值。无需手动选择和截取子字符串。

URL 解析器使用场景

前端路由调试
检查路径段和哈希片段是否与路由配置匹配。在产生 404 错误前,发现多余的斜杠或意外的查询参数。
后端 API 端点验证
在编写路由处理器或中间件之前,验证传入请求的 URL 是否包含正确的主机名、端口和路径结构。
DevOps 重定向规则测试
在编写 Nginx、Apache 或 CDN 重定向规则时,解析原始和目标 URL,确认每个组成部分的映射是否正确。
QA 链接验证
解析测试报告或缺陷工单中的 URL,找出是哪个查询参数或片段导致加载了错误页面。
数据管道 URL 提取
从日志文件或分析数据中的 URL 提取主机名或路径段,构建域级报告或按端点过滤流量。
学习 URL 结构
初学 Web 协议的学生和开发者可以粘贴真实 URL,立即直观了解每个定界符所标志的边界。

URL 组成部分参考

下表展示了 JavaScript URL 构造函数解析 URL 时返回的所有属性。Python 的 urlparse 结果、Go 的 url.URL 结构体以及 PHP 的 parse_url 输出中也存在相同的组成部分,但各语言的属性名称有所不同。

属性示例说明
protocolhttps:Scheme including the trailing colon
hostnameapi.example.comDomain name or IP address
port8080Port number (empty string if default)
pathname/v1/usersPath starting with /
search?page=2&limit=10Query string including the leading ?
hash#sectionFragment identifier including the leading #
originhttps://api.example.com:8080protocol + hostname + port
hostapi.example.com:8080hostname + port
usernameadminCredentials before @ (rarely used in practice)
passwordsecretCredentials before @ (avoid in production URLs)
href(full URL)The complete, serialized URL string

WHATWG URL 标准与 RFC 3986

两个规范定义了 URL 的解析方式。它们在基本结构上达成一致,但在边界情况上存在分歧——这种分歧通常就是浏览器与服务器处理同一 URL 时产生差异的根源。

WHATWG URL Standard
被所有现代浏览器和 JavaScript URL 构造函数使用。能接受并规范化不规范的输入:缺少 scheme、以反斜杠作为路径分隔符、通过 Punycode 处理非 ASCII 主机名。定义为 url.spec.whatwg.org 的动态标准。
RFC 3986
正式的 IETF 规范(2005 年)。比 WHATWG 更严格:拒绝浏览器可接受的某些输入。被众多服务端库使用,包括 Go 的 net/url 和 Python 的 urllib.parse。定义于 RFC 3986。

实际上,大多数差异出现在解析含国际化域名(IDN)、缺少 scheme 或特殊字符的 URL 时。WHATWG 解析器会自动将 IDN 主机名转换为 Punycode,而严格的 RFC 3986 解析器可能会拒绝此类输入。如果您将 URL 粘贴到本工具后看到与服务端代码不同的结果,最可能的原因就是 WHATWG 与 RFC 3986 之间的差异。

代码示例

各主流语言都内置了 URL 解析器。以下示例解析同一个 URL 并提取其组成部分。注意各语言命名上的细微差异:Python 使用 scheme 而非 protocol,Go 使用 RawQuery 而非 search。

JavaScript (browser / Node.js)
const url = new URL('https://api.example.com:8080/v1/users?page=2&limit=10#section')

url.protocol  // → "https:"
url.hostname  // → "api.example.com"
url.port      // → "8080"
url.pathname  // → "/v1/users"
url.search    // → "?page=2&limit=10"
url.hash      // → "#section"

// Iterate over query parameters
for (const [key, value] of url.searchParams) {
  console.log(`${key} = ${value}`)
}
// → "page = 2"
// → "limit = 10"

// Modify and re-serialize
url.searchParams.set('page', '3')
url.toString()
// → "https://api.example.com:8080/v1/users?page=3&limit=10#section"
Python
from urllib.parse import urlparse, parse_qs

result = urlparse('https://api.example.com:8080/v1/users?page=2&limit=10#section')

result.scheme    # → 'https'
result.hostname  # → 'api.example.com'
result.port      # → 8080
result.path      # → '/v1/users'
result.query     # → 'page=2&limit=10'
result.fragment  # → 'section'

# Parse query string into a dict
params = parse_qs(result.query)
params['page']   # → ['2']
params['limit']  # → ['10']

# Reconstruct with modifications
from urllib.parse import urlencode, urlunparse
new_query = urlencode({'page': '3', 'limit': '10'})
urlunparse(result._replace(query=new_query))
# → 'https://api.example.com:8080/v1/users?page=3&limit=10#section'
Go
package main

import (
	"fmt"
	"net/url"
)

func main() {
	u, err := url.Parse("https://api.example.com:8080/v1/users?page=2&limit=10#section")
	if err != nil {
		panic(err)
	}

	fmt.Println(u.Scheme)   // → "https"
	fmt.Println(u.Hostname()) // → "api.example.com"
	fmt.Println(u.Port())     // → "8080"
	fmt.Println(u.Path)       // → "/v1/users"
	fmt.Println(u.RawQuery)   // → "page=2&limit=10"
	fmt.Println(u.Fragment)   // → "section"

	// Query params as map
	q := u.Query()
	fmt.Println(q.Get("page"))  // → "2"
	fmt.Println(q.Get("limit")) // → "10"
}
PHP
<?php
$url = 'https://api.example.com:8080/v1/users?page=2&limit=10#section';
$parts = parse_url($url);

$parts['scheme'];   // → "https"
$parts['host'];     // → "api.example.com"
$parts['port'];     // → 8080
$parts['path'];     // → "/v1/users"
$parts['query'];    // → "page=2&limit=10"
$parts['fragment']; // → "section"

// Parse query string into an array
parse_str($parts['query'], $params);
$params['page'];    // → "2"
$params['limit'];   // → "10"

常见问题

URL 和 URI 有什么区别?
URL(统一资源定位符)是 URI(统一资源标识符)的一种具体形式,它同时包含标识符和访问机制(即 scheme,如 https://)。所有 URL 都是 URI,但并非所有 URI 都是 URL。URN(如 urn:isbn:0451450523)是一种 URI,通过名称标识资源而不指定获取方式。在 Web 开发中,这两个术语通常可以互换使用,因为你遇到的几乎所有 URI 都是 URL。
URL 构造函数如何处理相对 URL?
JavaScript URL 构造函数在解析相对路径时需要提供基础 URL。直接调用 new URL('/path?q=1') 会抛出 TypeError。必须提供基础地址:new URL('/path?q=1', 'https://example.com')。Python 的 urljoin 和 Go 的 url.ResolveReference 也有相同的用途。本工具要求输入包含 scheme 的完整绝对 URL。
URL 中没有端口号时会怎样?
省略端口时,解析器会为 port 属性返回空字符串。浏览器会假定使用该 scheme 的默认端口:https 为 443,http 为 80,ftp 为 21。您可以通过 origin 或 host 属性获取有效端口,但 port 字段本身保持为空,因为没有明确指定端口。
URL 中可以包含 Unicode 字符吗?
可以,但传输时必须进行编码。WHATWG URL 标准会自动处理:国际化域名转换为 Punycode(xn-- 前缀),路径和查询中超出 ASCII 范围的字符进行百分比编码。如果您将含 Unicode 的 URL 粘贴到本工具,解析结果中将显示规范化后的 ASCII 安全版本。
URL 的最大长度是多少?
没有标准规定 URL 的最大长度——RFC 3986 对此未作说明。实际上,浏览器会施加限制:Chrome 地址栏支持约 2MB,而 Internet Explorer(旧版)限制为 2,083 个字符。大多数 Web 服务器默认限制请求行为 8KB(Nginx 和 Apache 均是如此)。如果需要传递大量数据,建议使用 POST 请求体而非查询字符串。
如何只解析查询字符串而不处理完整 URL?
在 JavaScript 中,使用 new URLSearchParams('page=2&limit=10') 解析裸查询字符串。在 Python 中,使用 urllib.parse.parse_qs('page=2&limit=10')。两者都以键值对形式返回参数。当您只有查询字符串(例如来自表单提交或只记录了查询部分的日志条目)时,这种方式非常实用。
URL 解析与 URL 解码是同一回事吗?
不是。URL 解析将 URL 拆分为结构性组成部分(scheme、主机、路径、查询、片段)。URL 解码将百分比编码的字符还原为原始形式(%20 变为空格,%26 变为 &)。两种操作相辅相成:通常先解析 URL,再对各组成部分的值进行解码。如果先解码再解析,会破坏 URL 结构,因为解码后的定界符(如 & 和 =)会被误解析。