使用方案时,浏览器如何确定 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 有效的范围(即主要是 href
和 src
属性)。
我正在寻找一些 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 配置默认文档,并且没有在服务器上启用目录浏览。如何解决???
EasyUI中datagrid在ie下reload失败解决方案