如何忽略协议差异对比两个URL是否属于同一地址
忽略协议的URL对比技术方案
要实现忽略协议的URL匹配,核心思路是对两个URL做标准化预处理,消除不需要的差异项后再做全等对比即可,具体实现步骤如下:
- 第一步:补全缺失的协议头
如果URL没有带http://或https://前缀,统一临时补上默认协议(比如统一补https://),避免后续URL解析器识别失败。 - 第二步:使用标准URL解析库提取核心字段
不要手动切割字符串处理,直接调用编程语言内置的URL解析工具,提取出主机名(host)、路径(path)、查询参数(query)、*哈希片段(hash)*等核心字段,协议字段直接丢弃不参与对比。 - 第三步:路径标准化处理
- 路径为空或者为根路径
/时,统一处理为相同值 - 按需去掉路径末尾多余的斜杠
- 自动折叠路径中的相对路径标识,比如
./、../
- 路径为空或者为根路径
- 第四步:按需开启自定义标准化规则
如果业务场景不需要区分以下差异,可以自定义添加对应处理逻辑:- 忽略
www.前缀 - 忽略默认端口(80/443端口)
- 对查询参数按键名排序后再对比,忽略参数顺序差异
- 忽略哈希片段
- 忽略
- 第五步:将所有处理后的字段拼接为统一格式的字符串,直接做全等对比即可。
示例验证:对比
https://www.google.com和www.google.com/
- 对第二个无协议的URL补全协议,得到
https://www.google.com/- 提取两个URL的主机名均为
www.google.com,丢弃协议字段- 第一个URL路径为空,第二个为
/,统一处理后值相同- 其余字段均为空,处理后拼接结果完全一致,判定为同一个URL。
以下是Python的简单实现示例:
from urllib.parse import urlparse def normalize_url(url): # 补全缺失协议 if not url.startswith(("http://", "https://")): url = f"https://{url}" parsed = urlparse(url) # 路径标准化:空路径转为/,去除末尾斜杠 normalized_path = parsed.path.rstrip("/") or "/" # 拼接核心字段,不包含协议 return f"{parsed.netloc}{normalized_path}?{parsed.query}#{parsed.fragment}" # 测试用例 url_a = "https://www.google.com" url_b = "www.google.com/" print(normalize_url(url_a) == normalize_url(url_b)) # 输出 True
内容的提问来源于stack exchange,提问作者user14002256
相关产品推荐
相关产品推荐

