解析指向 URL 的相对引用

可以使用 URL() 构造函数URL.parse() 静态方法(属于 URL API)将相对引用和基本 URL 解析为绝对 URL。

两种方法都最多接受两个字符串参数,并返回一个表示绝对 URL 的 URL() 对象。第一个参数表示绝对 URL 或指向 URL 的相对引用,而第二个参数是基本 URL,用于在第一个参数中指定相对引用的情况下解析相对引用。两种方法以相同的方式解析相对引用,区别在于 URL() 构造函数会在传递无效 URL 时抛出异常,而 parse() 则返回 null

以下代码演示了在相同 urlbase URL 值下如何使用这些方法。

js
const url = "articles";
const base = "https://mdn.org.cn/some/path";
const constructorResult = new URL(url, base);
// => https://mdn.org.cn/some/articles
const parseResult = URL.parse(url, base);
// => https://mdn.org.cn/some/articles

从示例中可以看出,从提供的基本 URL 和相对引用解析 URL 不仅仅是将提供的参数连接起来。

在本例中,传递了一个相对于当前目录的路径(articles)。base URL 的当前目录是 URL 字符串直到最后一个正斜杠。这里 https://mdn.org.cn/some/path 没有尾随正斜杠,因此当前目录是 https://mdn.org.cn/some/,因此解析为最终 URL https://mdn.org.cn/some/articles

相对引用使用相对于以下位置的路径引用来解析为基本 URL:当前目录(./)、当前目录的父目录(../)或站点根目录(/)。以下部分介绍了每种类型的相对路径是如何解析的。

当前目录相对

./ 或无前缀开头的相对引用,例如 ./articlearticle./article/,相对于 base 参数所表示的 URL 的当前目录。

base URL 的当前目录是 URL 字符串直到最后一个正斜杠,对于以下代码块中的两个 base 字符串来说,都是 https://test.example.org/api/。当前目录相对引用 article 会附加到此,解析为 https://test.example.org/api/article

js
log(new URL("./article", "https://test.example.org/api/").href);
// => https://test.example.org/api/article
log(new URL("article", "https://test.example.org/api/v1").href);
// => https://test.example.org/api/article

类似地,以下两个基本 URL 字符串的当前目录都是 https://test.example.org/api/v2/。我们将 story/story 附加到这些目录,以解析最终 URL。

js
log(new URL("./story/", "https://test.example.org/api/v2/").href);
// => https://test.example.org/api/v2/story/
log(new URL("./story", "https://test.example.org/api/v2/v3").href);
// => https://test.example.org/api/v2/story

父目录相对

../ 开头的相对引用,例如 ../path,相对于 base 参数所表示的 URL 的当前目录的父目录../ 的每个实例都会从当前目录中剥离一个文件夹,然后任何在 ../ 之后的文本都会附加到剩余的基本路径。可以通过多次指定 ../ 来向上导航到父目录,但只能导航到站点根目录的级别。

例如,给定基本 URL https://test.example.com/test/api/v1/ 和一个父目录相对 URL ../some/path,当前目录是 https://test.example.com/test/api/v1/,父目录是 https://test.example.com/test/api/,解析后的绝对 URL 是 https://test.example.com/test/api/some/path

以下示例更详细地展示了这一点。在所有情况下,当前目录都是 https://test.example.org/api/v1/v2/(在第二种情况下,v3 在最后一个正斜杠之后),每个相对引用都解析为不同的父目录。

js
log(new URL("../path", "https://test.example.org/api/v1/v2/").href);
// => https://test.example.org/api/v1/path
log(new URL("../../path", "https://test.example.org/api/v1/v2/v3").href);
// => https://test.example.org/api/path
log(new URL("../../../../path", "https://test.example.org/api/v1/v2/").href);
// => https://test.example.org/path

根目录相对

/ 开头的相对引用,例如 /path,相对于 base 参数中指定的 URL 的站点根目录。例如,给定基本 URL https://test.example.com/api/v1,根目录相对 URL /some/path 的解析 URL 是 https://test.example.com/some/path

注意:解析根目录相对 URL 时,base URL 的路径部分无关紧要。

以下是一些其他示例。

js
log(new URL("/some/path", "https://test.example.org/api/").href);
// => https://test.example.org/some/path
log(new URL("/", "https://test.example.org/api/v1/").href);
// => https://test.example.org/
log(new URL("/article", "https://example.com/api/v1/").href);
// => https://example.com/article

另请参见