带href="./etc"的a标签如何解析?Chrome是否遵循RFC 3986?
相对URL解析差异:浏览器 vs Ruby的原因
核心原因:基础URI(Base URI)的差异
浏览器和Ruby解析结果不同,问题出在相对URL的解析基准——基础URI上:
1. 浏览器的解析逻辑
浏览器解析相对URL时,优先使用页面中<base>标签指定的地址作为基础URI。你提到的spielplan/index.html页面里,大概率存在类似这样的标签:
<base href="/de/">
这个标签会把所有相对URL的解析基准设置为站点的/de/路径,而非当前页面所在的/de/spielplan/目录。所以./produktionen/...会被解析为/de/produktionen/...,和浏览器的跳转结果一致。
2. Ruby的URI.join逻辑
Ruby的URI.join方法只会使用你传入的第一个参数(页面URL)作为基础URI,它不会读取页面中的<base>标签内容。对于https://www.salzburger-landestheater.at/de/spielplan/index.html,它会自动提取其“目录部分”——https://www.salzburger-landestheater.at/de/spielplan/作为基准,所以./produktionen/...会被解析为/de/spielplan/produktionen/...,这就是你得到预期但无效URL的原因。
官方文档依据
- RFC 3986 第5.1节:明确了基础URI的确定规则,其中提到如果文档中有指定的基础URI(比如HTML的
<base>标签),则优先使用该值作为解析基准。 - HTML规范:
<base>标签的作用就是定义页面中所有相对URL的解析基准,浏览器必须遵守这个规则。
验证方法
你可以打开spielplan/index.html页面的开发者工具,查看HTML头部是否存在<base>标签——这就能直接验证上述结论。
内容的提问来源于stack exchange,提问作者dani-sc
相关产品推荐
相关产品推荐

