Tampermonkey中GM.xmlHttpRequest对协议相对URL的解析问题解析
2025-06-12 16:24:40作者:伍希望
问题背景
在Web开发中,协议相对URL(Protocol-relative URLs)是一种常见的URL书写方式,它省略了协议部分(如http:或https:),只以双斜杠//开头。这种URL会根据当前页面的协议自动选择使用HTTP或HTTPS协议,从而提高兼容性和安全性。
然而,在Tampermonkey 5.1.1版本中,用户报告了一个关于GM.xmlHttpRequest方法处理协议相对URL时的bug。当使用这种URL时,Tampermonkey未能正确解析URL,导致请求失败。
问题表现
当用户尝试使用如下格式的URL发起请求时:
//cdn.jsdelivr.net/npm/left-pad@1.3.0/index.min.js
Tampermonkey错误地将URL解析为:
https://npm/left-pad@1.3.0/index.min.js
可以看到,解析过程中出现了两个主要问题:
- 域名部分
cdn.jsdelivr.net被错误地截断为npm - 路径部分也被错误处理
这导致请求最终失败,返回状态码0,且没有有效的响应内容。
技术分析
协议相对URL的正确解析应该遵循以下规则:
- 保留完整的域名部分
- 根据当前页面使用的协议(HTTP或HTTPS)自动补全协议部分
- 保持路径部分完整不变
在Tampermonkey的实现中,URL解析器在处理协议相对URL时出现了逻辑错误,可能是由于:
- 对双斜杠开头的URL特殊处理不足
- 域名解析逻辑存在缺陷
- URL拼接过程中出现了意外的字符串截断
解决方案
Tampermonkey开发团队已经在5.3.6213 beta版本中修复了这个问题。用户可以通过以下方式获取修复:
- 下载beta版本的CRX文件
- 在Chrome扩展页面(chrome://extensions)启用开发者模式
- 将CRX文件拖拽安装
安装前建议先通过Tampermonkey的"Utilities"选项卡导出当前设置和脚本,安装新版本后再导入。
最佳实践
为避免类似问题,开发者在使用GM.xmlHttpRequest时可以:
- 尽量使用完整URL(包含协议部分)
- 如果必须使用协议相对URL,可以先通过JavaScript的URL API进行规范化处理
- 在请求失败时添加适当的错误处理和重试逻辑
总结
URL解析是浏览器扩展开发中的基础但重要的一环。Tampermonkey团队对此问题的快速响应展示了他们对产品质量的重视。开发者在使用这类高级API时,应当注意边界条件的测试,特别是对于特殊格式的输入处理。同时,关注项目的更新动态,及时升级到修复了已知问题的版本,可以避免很多潜在的兼容性问题。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0185
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0112
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
JoyAI-EchoJoyAI-Echo,这是一个独立的、仅用于推理的版本,旨在实现分钟级多镜头音视频生成。它采用了经过蒸馏的DMD生成器、配对的跨模态记忆以及故事级别的一致性。其性能的核心在于,一个跨模态视听记忆库能够在长达五分钟的视频中保持角色外观和语音音色的一致性。同时,一个训练后处理流程将基于记忆的强化学习与分布匹配蒸馏相结合,实现了7.5倍的速度提升,显著增强了视觉质量和对齐效果。00
omega-aiOmega-AI:基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算,GPU支持CUDA,CUDNN。Java03
llm-universe本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/Jupyter Notebook08
最新内容推荐
项目优选
收起
暂无描述
Dockerfile
759
4.94 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
854
1.91 K
deepin linux kernel
C
32
16
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
674
1.32 K
Ascend Extension for PyTorch
Python
716
866
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.78 K
185
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
454
436
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.07 K
1.09 K
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
991
598
暂无简介
Dart
1 K
259