GitHub Pages和相对路径

99

我已经为我在GitHub上正在开发的项目创建了一个gh-pages分支。

我使用Sublime文本编辑器在本地编写网站,我的问题是,当这些内容被推送到GitHub后,所有指向JavaScript、图片和CSS文件的链接都无效了。

例如,在我的部分中有这样一个链接。

<link href="assets/css/common.css" rel="stylesheet">

这在本地运行得很好,但由于链接没有使用存储库名称作为URL的一部分来解析,因此它在GitHub上无法正常工作。

它要求:

http://[user].github.io/assets/css/common.css

当它应该询问的是:

http://[user].github.io/[repo]/assets/css/common.css.
我当然可以将存储库名称作为URL的一部分,但这将阻止我的站点在开发期间在本地工作。
有什么好的解决办法吗?

2
这种情况也发生在我身上了。你能找出原因吗? - Andrey Mikhaylov - lolmaus
1
注意:在2016年12月,GitHub页面发生了很大的变化。请参见下面的我的回答 - VonC
2
2022年了,Github页面中相对链接的问题仍然存在。 - Timo
8个回答

82

你需要使用Jekyll

相关文档中直接复制:

有时在将gh-pages分支推送到GitHub之前,预览您的Jekyll网站是很好的。然而,GitHub用于项目页面的类似子目录的URL结构使得URL的正确解析变得复杂。这里提供一种方法来利用GitHub项目页面URL结构(username.github.io/project-name/),同时保持本地预览Jekyll网站的能力。
  1. _config.yml中,将baseurl选项设置为/project-name - 注意前导斜杠和尾随斜杠的缺失。

  2. 引用JS或CSS文件时,请使用以下方式:{{ site.baseurl}}/path/to/css.css - 注意变量后面的斜杠(就在“path”之前)。

  3. 进行永久链接或内部链接时,请使用以下方式:{{ site.baseurl }}{{ post.url }} - 请注意两个变量之间没有斜杠。

  4. 最后,如果您想在使用jekyll serve预览您的网站之前提交/部署,请确保将一个空字符串传递给--baseurl选项,以便您可以在localhost上正常查看所有内容(不需要在开头加上/project-name):jekyll serve --baseurl ''

这样,您就可以从localhost的站点根目录本地预览您的网站,但是当GitHub从gh-pages分支生成您的页面时,所有的URL都将以/project-name开头并正确解析。

显然,有人仅几个月前找到了这个问题的解决方法。


5
是的,这个答案应该被采纳。对于一个普通的 Jekyll 使用情况来说似乎有点复杂——我想知道他们为什么不默认使用 site.baseurl?请帮我翻译这段话。 - Kevin Qi
4
虽然这是几年前的内容,文档已经有所更改,但是这个解决方案对我来说比 Jekyll 文档中推荐的使用 {{ site.github.url }} 更有效。 - Kyle Shevlin

14

你使用的是哪个浏览器?你确定会发生这种情况吗?因为不应该出现这种情况。如果在链接中包含相对URL,它将相对于包含该链接的文档的URL进行解析。换句话说,当你包含

时,

应该属于其他内容,并且不能独立成为一行。

<link href="assets/css/common.css" rel="stylesheet">
在 HTML 文档中,如果链接 assets/css/common.css 的地址为 http://www.foo.com/bar/doc.html,则该链接将通过将它附加到 HTML 文档的 URL 前缀(不包括路径的最后一部分 doc.html)来解析,即该链接将被解析为 http://www.foo.com/bar/assets/css/common.css,而非你所说的 http://www.foo.com/assets/css/common.css
例如,查看 Twitter Bootstrap 网页源代码:http://twitter.github.io/bootstrap/。注意顶部的样式链接,其指定为 <link href="assets/css/bootstrap.css" rel="stylesheet">。该链接正确解析为 http://twitter.github.io/bootstrap/assets/css/bootstrap.css,即它包括仓库名称。

7
你如何处理 href="/" - Akabab

12
你可以只是把这个放在那里。
<base href="/[repo]/">

<head>标签内部,它解决了这个问题。

你还可以通过设置以下内容来改进这个解决方案:

<base href="{{site.baseurl}}" />

然后将site.baseurl设置为空字符串进行本地测试。


1
如果你不想折腾Jekyll之类的东西,这是最好的解决方案。 - Pro Q
1
谢谢!但是你能给一些参考资料吗?特别是关于site.baseurl的问题?我的意思是,我能从控制台访问这个site吗? - Patrick Martinus
<base href="/[repo]/"> 在页面上可以工作,但在本地主机上不行。 - Timo
我仍然想找到一种方法来使用本地主机和页面来运行相同的代码,但不使用Jekyll。你提供的第一个解决方案是针对远程的。 - Timo

5
这个问题应该在2016年12月后不再是问题,三年半之后。
请查看Ben Balter发布的“GitHub页面的相对链接”:

您一直可以在GitHub.com上编写Markdown时使用相对链接。

(这是从2013年1月开始的)

现在,当通过GitHub Pages发布时,这些链接将继续工作。

如果您的存储库中有一个Markdown文件位于docs/page.md,而您想从该文件链接到docs/another-page.md,则可以使用以下标记:

[a relative link](another-page.md)

当您在GitHub.com上查看源文件时,相对链接将继续工作,就像以前一样,但是现在,当您使用GitHub Pages发布该文件时,该链接将被静默地转换为docs/another-page.html,以匹配目标页面的已发布URL。在幕后,我们正在使用开源Jekyll Relative Links插件,该插件默认为所有构建启用。GitHub Pages上的相对链接还考虑了文件YAML前置数据中的自定义永久链接(例如,permalink: /docs/page/),并在适当的情况下添加项目页面的基本URL,确保链接在任何上下文中都能正常工作。不要忘记自2016年8月起,您可以直接从master分支发布页面(而不总是gh-pages分支)。
自从2016年12月以来,您甚至不需要Jekyllindex.md简单的Markdown文件就足够了。

您的回答中有很多有用的信息 - 谢谢。但是,在阅读了所有链接的文章后,我仍然不明白为什么在github pages进程中,我的.md文件中html表格中的相对链接未被转换为.html。也就是说,在我的.md文件中有一个包含指向其他存储库中其他.md文件的相对链接的html表格。该表在github.com上呈现正常,但是在github pages中,相对链接仍然是.md文件。为什么? - user5395338
@Seamus 我从未见过在 HTML 元素(如表格)中进行这种转换。我认为相对链接仅在使用纯 Markdown 页面时转换,而不是在混合使用 Markdown 和 HTML 元素时转换。 - VonC
显然是这种情况。但似乎我被迫在一个丑陋的不对称表格和未正确转换的链接之间做出选择。有什么建议/答案吗?参考链接 - user5395338

4

看起来Github Pages的响应不是很快。虽然它可以立即使新文件可用,但由于缓存或其他原因,修改后的文件不会立即出现。

等待15分钟左右,一切就好了。


这也是我的情况。 - Jake
@AndreyMikhaylov-lolmaus:似乎点赞也不是很敏感 :) - user5395338

1
另一种选择是创建一个专门用于github.io网页的新存储库。如果您在github上将存储库命名为[user].github.io,它将被发布到https://[user].github.io,并且您可以 完全避免在URL路径中使用存储库名称。显然,缺点是每个github用户只能有1个这样的存储库,因此可能不适合您的需求,我不确定。

1
最佳选择现在是使用relative_url过滤器:
<link href="{{ '/assets/css/common.css' | relative_url }}" rel="stylesheet">

1
我认为过滤器relative-Url是Jekyll的一个例子,但你应该提到它。 - Timo

0
我遇到了这个问题,但还有一个额外的复杂情况 - 一些静态内容的URL出现在模板中,这些模板被包含在整个网站中。解决方案<base href="/[repo]/">只适用于相对URL,而不适用于以/开头并且相对于根URL的路径绝对URL。但是,将这些URL设置为相对路径也不起作用,因为我只是使用Jinja进行基本渲染,而不是像Jekyll这样使用完整的构建系统。因此,在渲染的页面上,相对路径是不正确的。
似乎最简单的解决方案是为页面设置一个自定义域名。通过自定义域名,仓库名称不会附加到URL上,一切都能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接