GitHub页面和相对路径


76

gh-pages为我正在GitHub上进行的项目创建了一个分支。

我使用Sublime文本在本地创作网站,而我的问题是,当将其推送到GitHub时,所有指向Javascrips,图像和CSS文件的链接均无效。

例如,我的头部中有这个。

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

这在本地很好用,但是在GitHub上不起作用,因为链接没有使用资源库名称作为URL的一部分来解析。

它要求:

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

什么时候应该要求:

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

我当然可以将回购名称作为URL的一部分,但这会阻止我的网站在开发过程中在本地工作。

知道如何处理吗?


1
这发生在我身上。您是否设法找出原因?
Andrey Mikhaylov-lolmaus

1
注意:2016年12月,GitHub页面发生了很大变化。请参阅下面的答案
VonC

Answers:


13

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

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

在的HTML文档中http://www.foo.com/bar/doc.html,到的链接assets/css/common.css将通过将其附加到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,即它确实包含回购名称。


3
你如何处理href="https://stackoverflow.com/"
Akabab

71

您需要使用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请按以下步骤进行:–注意紧随变量后的斜杠(“路径”之前)。

  3. 在进行永久链接或内部链接时,请执行以下操作:{{ site.baseurl }}{{ post.url }}–请注意,两个变量之间没有斜杠。

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

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

(显然有人是几个月前才知道的。)


4
是的,这个应该是公认的答案。对于常见的Jekyll用例似乎有些费解-我想知道是否有原因默认情况下不使用site.baseurl?
凯文·齐

4
尽管这已经有好几年历史了,并且文档也有所更改,但该解决方案对我的使用超过了Jekyll文档中所建议的使用方式{{ site.github.url }}
Kyle Shevlin

8

你可以放

<base href="/[repo]/">

<head>标签内部,它可以解决问题。

您还可以通过设置以下内容来改进此解决方案:

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

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


如果你不想鬼混与哲基尔和所有这一切,这是最好的解决办法
临Q

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上的相对链接还考虑permalink: /docs/page/了文件的YAML前端问题中的自定义永久链接(例如),并在适当时添加了项目页面的基本URL,以确保链接在任何情况下都能正常工作。

并且不要忘记,自2016年8月以来,您可以直接从master分支机构发布页面(不总是gh-pages分支机构)

201612月以来,您甚至不需要Jekyllindex.md简单的markdown文件就足够了。


您的答案有很多很好的信息-谢谢。但是,在通读了所有链接文章之后,我仍然茫然不解,为什么html table在github页面过程中,.md文件中的.md文件中的相对链接没有转换为.html。即在我的.md文件中是一个html表,其中包含到我的存储库中其他.md文件的相对链接。该表可以在github.com上正确显示,但是在github页面上,相对链接仍保留为.md文件。为什么?
Seamus

@Seamus我从未在html元素(如表)中看到这种转换。我假设相对链接仅在使用纯markdown页面时才转换,而不是在markdown和HTML元素混合在一起时才转换。
VonC

显然是这样。但是,似乎我不得不在丑陋的不平衡表和未正确转换的链接之间进行选择。有什么建议/答案吗?
Seamus



0

另一种选择是专门为github.io网页创建一个新的仓库。如果您[user].github.io在github上命名存储库,那么它将在处发布,https://[user].github.io可以避免将存储库名称完全放在URL路径中。显然,缺点是每个github用户只能有1个这样的回购协议,所以我不确定,它可能无法满足您的需求。


我只能冒险猜测,下降投票者认为您的回答没有解决问题。但是,我发现它很有用,所以+1!
Seamus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.