它们都是 URL 路径。 不过,它们有不同的名称。
<!-- root-relative -->
<a href="./dogs.html">Dogs</a>
<!-- absolute -->
<a href="/dogs.html">Dogs</a>
还有完全限定的 URL,就像
<!-- fully qualified -->
<a href="https://website.com/dogs.html">Dogs</a>
完全限定的 URL 在其功能方面非常明显 - 该链接将带您到该确切的位置。 因此,让我们再次查看前两个示例。
假设您在网站上有一个这样的目录结构
public/
├── index.html
└── animals/
├── cats.html
└── dogs.html
如果您在 cats.html
上放置一个链接到 /dogs.html
(“绝对”路径)的链接,它将返回 404 - 该网站的根级别没有 dogs.html
! 路径开头的 /
表示 “从 最底层 开始,并从那里向上移动”(其中 public/
是最底层)。
cats.html
上的该链接需要写成 ./dogs.html
(从上一个目录开始向上移动)或 /animals/dogs.html
(明确说明要从哪个目录开始)。
当然,目录结构越复杂,绝对 URL 就越长。
public/
├── animals/
└── pets/
├── c/
| └── cats.html
└── d/
└── dogs.html
使用这样的结构,dogs.html
要链接到 cats.html
,它必须是……
<!-- Notice the TWO dots, meaning back up another folder level -->
<a href="../c/cats.html">cats</a>
<!-- Or absolute -->
<a href="/animals/pets/c/cats.html">cats</a>
值得注意的是,在这种情况下,如果 animals/
重命名为 animal/
,则相对链接仍然有效,但绝对链接将不起作用。 这是使用绝对链接的缺点。 当您非常具体时,对路径进行更改会影响您的链接。
我们只查看了 HTML 链接到 HTML,但这个概念在网络(基本上是计算机)中是通用的。 例如,在 CSS 文件中,您可能有
body {
/* Back up one level from /images and follow this path */
background-image: url(./images/pattern.png);
}
……在这种情况下将是正确的
public/
├── images/
| └── pattern.png
├──index.html
└── style.css
但是,如果您要移动 CSS 文件……
public/
├── images/
| └── pattern.png
├── css/
| └── style.css
└── index.html
……那么它就变得错误了,因为您的 CSS 文件现在嵌套在另一个目录中,并且引用的是来自更深层次的路径。 您需要再退回到一个文件夹级别,使用两个点,例如 ../images/pattern.png
。
一种 URL 格式并不比另一种更好 - 这取决于您认为哪种在当时更实用和直观。
对我来说,我会考虑最不可能改变的东西。 对于像图像资源这样的东西,我发现我极不可能移动它,因此使用绝对 URL 路径(例如 /images/pattern.png
)链接到它似乎是最安全的。 但是,对于链接在一起的所有都恰好位于同一目录中的文档,相对链接它们似乎更安全。
假设 dogs.html 和 cats.html 位于同一目录中,并且您想从 dogs 转到 cats,为什么不直接写
cats.html
而不是./cats.html
呢?所有链接引用都基于基本“public”目录,因此 cats.html 的位置将与 ./cats.html 不同
cats.html 将位于 public/cats.html
./cats.html 将位于 public/anotherdirectory/cats.html
我认为,您唯一可以从 dogs 转到 cats 使用“cats.html”的方法是,dogs.html 和 cats.html 都位于 public/dogs.html 和 public/cats.html
好的,但是 ./dogs.html 和 dogs.html 有什么区别?
如果没有前导的“/”,则假设“dogs.html”位于根级别 - “public/dogs.html”。 而 ./dogs.html 将位于下一级 - “public/anotherdirectoy/dogs.html”。
为什么“public 是最底层”? 它不是在顶部吗?
我仍然不明白这个树形结构,在我的链接目标之前加斜杠和点,直到它起作用。 哎。
这个主题看起来很简单,但对我来说非常有用。 谢谢。 我不知道为什么,但通常对带点的链接不太确定。
有时,(在构建相对 URL 时)在终端中使用 CD 命令从您的 HTML/CSS 文件所在位置开始,然后尝试执行“CD ../animals/”以查看它是否有效,会更容易。 相对 URL 的工作方式与您在终端中的路径相同。
我不明白 ./ 有什么意义,因为您可以省略它,例如“./dogs.html”似乎与“dogs.html”相同,“./images/pattern.png”与“images/pattern.png”相同,等等。
另外,我发现措辞令人困惑,您提到 ./ “从上一个目录开始”,并且您需要 ../ “再退回到一个文件夹级别,使用两个点”,但这种模式没有延续,要再退回到更上一级,您需要 ../../,所以点的数量实际上并没有跟踪您已经遍历了多远。
也许是我误解了这篇文章,但我对“根相对”和“绝对”这两个词感到困惑
据我所知,绝对 URL 以方案开头,后面跟着一个冒号,例如“http:”。 这就是我对 RFC 3986 的理解。 另请参见 https://kb.iu.edu/d/abwp 。 因此
/dogs.html
不是绝对 URL,而是相对 URL。 事实上,它是一个根相对 URL,因为它以斜杠开头,因此不是相对于当前目录,而是相对于基本目录。 另一方面,./dogs.html
只是引用了同一目录中的资源dogs.html
,所以链接与您写<a href="dogs.html">Dogs</a>
时相同,正如 MKM 所述吗?“
cats.html
上的该链接需要写成./dogs.html
(从上一个目录开始向上移动)”但是
./dogs.html
不是上一个目录,而是在同一目录。 上一个目录是../dogs
。 一个点表示当前目录,两个点表示父目录,就像在 UNIX 文件路径中一样,还是不对?我认为,它应该说
也许对 URL 比我更了解的人可以告诉我,哪个是正确的。
您好 matzilla,
您是正确的,但是,URI 和 URL 之间存在差异
matzilla,您是正确的,但是,URI 和 URL 之间存在细微的差异
也许是另一个主题,但是是什么让它起作用
没有“http”或“https”,我错过了一些备忘录。 :)
以正斜杠开头的 URL 不是绝对的,它们相对于域名。 唯一的例外是双正斜杠,我猜可以将其描述为相对于正在使用的协议。