使用方案时,浏览器如何确定 href 中的 URL 是不是是相对的?

Posted

技术标签:

【中文标题】使用方案时,浏览器如何确定 href 中的 URL 是不是是相对的?【英文标题】:How do browsers determine whether an URL in an href is relative or not when using a scheme?使用方案时,浏览器如何确定 href 中的 URL 是否是相对的? 【发布时间】:2013-01-23 22:59:48 【问题描述】:

假设我有以下链接标签:<a href="tel:+15555555">Phone number</a>

浏览器究竟如何知道不从当前服务器加载相对位置./tel:+15555555,而是知道tel 应该被解释为一个方案?

检测主机相对 URL (/…) 或协议相对 URL (//…) 似乎很简单。我猜 HTTP-URL(http://…https://…)对于特殊情况也很简单。但是浏览器是如何使用任意方案解析 URL 的呢?我知道一个有效的方案必须以小写字母开头,并且可能只包含小写字母或字符+-.,这在一定程度上限制了范围…… 当然,我知道整个问题只涉及相对 URL 有效的范围(即主要是 hrefsrc 属性)。

我正在寻找一些 RFC 的链接(例如,它禁止非 URL 编码的冒号是方案分隔符)以及各种浏览器的 URL 解析内部的源代码。

【问题讨论】:

@Pumbaa80:冒号在 URL 的任何部分都有效。我正在寻找一个禁止它们在相对 URL 中或在未转义时使用的规范:从 en.wikipedia.org/wiki/ECMAScript 到 special:Random 的链接可能不明确地链接到 en.wikipedia.org/wiki/special:Random 以及 special: 方案的 Random URL .我想知道究竟在哪里解决了这种歧义(规范或源代码)。 不能同时是绝对URI和相对路径。这是RFC3986 所说的:“包含冒号字符(例如,“this:that”)的路径段不能用作相对路径引用的第一段,因为它会被误认为是方案名称。这样的段之前必须有一个点段(例如,“./this:that”)以进行相对路径引用。” @Pumbaa80 您能否将此评论添加为答案,我会接受它(除非有人愿意搜索 WebKit 和 Mozilla 源代码,在这种情况下,他们应该得到接受的答案)。 【参考方案1】:

href 值被解析为 URI(参见 RFC 3986)。作为解析的结果,浏览器将知道这是一个绝对 URI,而不是相对引用。

事实上,路径组件中允许未转义的“:”;只是它们需要出现在第一个“/”之后;否则,如果前面的字符都是有效的方案名称字符,则它们可以被解析为方案分隔符。

见http://greenbytes.de/tech/webdav/rfc3986.html#path

RFC 在section 4.2(标题为“相对引用”)中也有以下说法:“包含冒号字符(例如,“this:that”)的路径段不能用作相对路径引用的第一段,因为它会被误认为是方案名称。这样的段之前必须有一个点段(例如,“./this:that”)以进行相对路径引用。” (强调)。

【讨论】:

那么只有在解析为绝对URI失败时才尝试相对引用? @Raphael Schweikert:正确。 the HTML5 spec 中有一个部分基本上确定了大多数(如果不是所有)浏览器已经在做的事情。 同样,相关的是 RFC 3986。它包含适用于所有引用的 ABNF(增强巴科斯-瑙尔形式),无论是否绝对。解析的结果会告诉你它是否是绝对的。见greenbytes.de/tech/webdav/rfc3986.html#rfc.section.4.1【参考方案2】:

请参阅RFC 3966 了解tel URI 规范,以及RFC 3986 了解更通用的URL 规范。将方案与“层次部分”分开的是冒号 (:)。

【讨论】:

谢谢。但这并不能真正回答我的问题。我一直在寻找一个更通用的答案:即使浏览器供应商提供特殊情况的 tel: 链接(就像他们最有可能对 http(s): 所做的那样,还有许多其他方案可以在外部应用程序中打开,任何一个都没有描述RFC…

以上是关于使用方案时,浏览器如何确定 href 中的 URL 是不是是相对的?的主要内容,如果未能解决你的问题,请参考以下文章

没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览。如何解决???

获取 url 时如何强制网络浏览器使用 POST?

EasyUI中datagrid在ie下reload失败解决方案

IOS:使用 url 方案从浏览器启动应用程序时加载视图控制器?

通过自定义URL方案启动Blackberry应用程序

如何确定向远程 Spring Boot 服务器发送请求的 URL?