虽然脚本的 MDN 文档没有帮助,但这篇文章http://brianvanderplaats.com/2017/01/16/understanding-relative-urls/涵盖了这个问题并解释了如何处理相对路径。
这个怎么运作
处理脚本的方式不是由服务器决定,而是由浏览器决定。 浏览器解析元素并发出 HTTP GET 请求以请求 javascript 文件。
例如,如果打开以下浏览器页面http://host.com/app/dir1/index.html
并找到以下脚本元素:
<script src="file.js"></script>
在 Chrome 的 devtools 中检查时,我看到发送到服务器的文件的 HTTP GET。
http://host.com/app/dir1/file.js
标准怎么说
4.3.1 中的HTML 标准script 元素说:
如果元素具有 src 属性,则必须相对于元素解析该属性的值,如果解析成功,则必须从元素文档的来源获取指定的资源。
这意味着相对于 index.html 文件,然后通过文档的来源(即document.location.origin
进行请求。 注意:从技术上讲,元素指的是 DOM 元素,但我保持简单。
如果我们更改 index.html 文件以包含一个点,那么我们会看到发出了相同的 HTML GET。 所以这:
<script src="./file.js"></script>
还导致发出相同的 HTTP GET:
http://host.com/app/dir1/file.js
希望这清楚地表明src="file.js"
在功能上与src="./file.js"
。
使用<base>
元素时电流会改变
值得注意的是,如果<base>
元素存在,那么将使用它而不是当前位置。 例如,
<html>
<head>
<base href="https://just-a-test/dir1/">
<script src="./file33.js"></script>
</head>
<body>... rest not shown
然后浏览器会发出一个 HTTP GET 请求
https://just-a-test/dir1/file33.js
另一个有趣的情况是,相对路径使用子目录或点-点语法来访问父目录../images/img1.png
。
在这两种情况下,浏览器都会为它认为是正确名称的资源解决名称和问题以及 HTTP GET 请求。 所以
<html>
<head>
<base href="https://just-a-test/dir1/">
</head>
<body>
<img src="../images/img1.png"></script>
</body>
</html>
导致对以下文件的 HTTP GET 请求。
https://just-a-test.com/images/img1.png
<base>
可以包含文件名
最后, <base>
元素可以包含一个文件名,例如:
<html>
<head>
<base href="https://just-a-test/dir1/index.html">
</head>
<body>
<img src="img44.png"></script>
</body>
</html>
发生这种情况时,文件名将被删除,只使用剩余的路径,因此在这种情况下,会为此文件发出 HTTP GET 请求。
https://just-a-test.com/dir1/img44.png
而不是文件https://just-a-test.com/dir1/index.html/img44.png
。
我提出这个案例是因为一个常见的错误是去掉尾部斜杠并想知道为什么事情不起作用。 例如,
<html>
<head>
<base href="https://just-a-test/dir1">
</head>
<body>
<img src="img44.png"></script>
</body>
</html>
导致 HTTP GET 请求到
https://just-a-test.com/img44.png
这可能会让您认为它不起作用。 发生这种情况是因为dir1
与前面示例中的index.html
一样被查看,并且在发出 HTTP GET 请求时被忽略。
<base>
文档
base 的 MDN 文档在这里, <base>
的 HTML5 标准在这里。 我的亮点是:
如果文档没有元素,则浏览器使用 location.href。 基础可以包括文件名。
如果使用多个元素,则仅遵循第一个 href 和第一个目标——所有其他元素都将被忽略。
基本元素必须具有 href 属性、目标属性或两者兼有。
基本元素必须放在<head>
元素中。
基本元素没有结束标记。