174

Jekyll uses Markdown-formatted links, but how can I link to internal content?

[[link]] 
Sean Allred
  • 3,558
  • 3
  • 32
  • 71
JuanPablo
  • 23,792
  • 39
  • 118
  • 164

7 Answers7

286

You can now post internal links by using the following:

[Some Link]({% post_url 2010-07-21-name-of-post %})

This is also referenced in the Jekyll Documentation.

https://github.com/mojombo/jekyll/pull/369

Ivar
  • 4,350
  • 2
  • 27
  • 29
Brett Hardin
  • 4,012
  • 2
  • 19
  • 22
74

It is now possible to link to pages other than posts using the link tag. link works for posts, pages, documents in a collection, and files.

{{ site.baseurl }}{% link _collection/name-of-document.md %}
{{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %}
{{ site.baseurl }}{% link news/index.html %}
{{ site.baseurl }}{% link /assets/files/doc.pdf %}

Remember to include the file extension when using the link tag. To use it to create a link:

[Link to a document]({{ site.baseurl }}{% link _collection/name-of-document.md %})
[Link to a post]({{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %})
[Link to a page]({{ site.baseurl }}{% link news/index.html %})
[Link to a file]({{ site.baseurl }}{% link /assets/files/doc.pdf %})

See Jekyll Documentation.

Ivar
  • 4,350
  • 2
  • 27
  • 29
elfxiong
  • 955
  • 7
  • 12
  • 3
    I also found this documentation page helpful - https://jekyllrb.com/docs/liquid/tags/#link – David Douglas Oct 16 '18 at 09:37
  • 3
    I've just found that there is no need to use `{{ site.baseurl }}` since it doubles baseurl value in the generated href. `[Link to a post]({% link _posts/2016-07-26-name-of-post.md %})` – oleksa Oct 31 '19 at 12:09
  • 4
    You need to use site.baseurl on Jekyll 3.x, it is no longer needed in 4.x. But Pages is still stuck on 3.x as the max version, AFAIK. – Henry Schreiner Jun 17 '20 at 21:42
26

For pages, they decided not to add a page_url tag because you'd have to know the path of the page anyway. So you just have to link to it manually:

[My page](/path/to/page.html)

Or you can do something big and ugly like this if you want to programatically get the title of the page:

{% for page in site.pages %}
  {% if page.url == '/path/to/page.html' %}
[{{ page.title }}]({{ page.url }})
  {% endif %}
{% endfor %}
bmaupin
  • 14,427
  • 5
  • 89
  • 94
  • 1
    As another answer has noted, there is the `{% link ... %}` tag which is recommended to be used, as it helps ensure links are made correctly, and it will give you an error if a link is broken. See https://jekyllrb.com/docs/liquid/tags/#link – Simon East Jan 12 '21 at 07:04
25

If the internal content is on the same page then it is possible to link to it using the auto_ids feature. You enable this in _config.yml:

kramdown:
    auto_ids: true

With this enabled each heading gets an id ref based on the heading text. For example

### My Funky Heading

will become

<h3 id="my-funky-heading">My Funky Heading</h3>

You can link to this from within the same document by doing something like this:

The funky text is [described below](#my-funky-heading)

You can assign an explicit id if you prefer:

### My Funky Heading
{: #funky }

and link to it

The funky text is [described below](#funky)
starfry
  • 9,273
  • 7
  • 66
  • 96
  • That works even if you want to reference other elements than titles. – Antônio Medeiros Sep 20 '19 at 12:26
  • This can also be extended for links in other pages. e.g.: [text] (/path/to/file/#funky) – Robur_131 May 20 '20 at 06:59
  • Note that the `kramdown` `auto_ids` feature is [true by default](https://kramdown.gettalong.org/options.html) so you have it enabled as long as you don't explicitly _disable_ it `_config.yml`. – mefryar Aug 11 '21 at 23:45
9

There are multiple ways of linking in Jekyll, some of which are now outdated.

With link tags

The recommended way to link to internal files is

[Link]({{ site.baseurl }}{% link path/to/file.md %})

Note that this will cause an error if the file moves or gets deleted.

With permalinks

To link to a page without causing errors (broken links instead):

[Link]({{ '/path/to/page/' | relative_url }})

Note that here you need to know the permalink of the page and pass it through the relative_url filter to ensure that it is prefixed with the base url of the site.

The permalink of a page depends on the permalink setting in your config file and the permalink key in the front matter of the file.

With jekyll-relative-links

If you want to use relative paths (and want the links to work in GitHub's markdown view), you should use jekyll-relative-links. This lets you write links like:

[Link](./path/to/file.md)

[Link to file in parent folder](../file.md)
qwtel
  • 4,467
  • 1
  • 18
  • 12
2

Imagine this is your project directory:

project directory

To link "index.md" to a file inside folder "blog" called "20190920-post1.md", do the following:

  1. Open the file "index.md".
  2. Add the following:

    [any text](./relative path)

For example:

- [Sept 20th 2019 - Kikucare's Journey](./blog/20190920-post1.md)

Output:

enter image description here

yoges nsamy
  • 1,275
  • 1
  • 16
  • 29
  • What if Jekyll then keeps the link to the `.md` file and does not convert `.md` to `.html`? -- Then the plugin https://github.com/benbalter/jekyll-relative-links should be activated. – koppor Nov 10 '22 at 23:30
0

Working in Jekyll 3.9.x:

In HTML: <a href="{{ '/blog/' | relative_url }}">Link to blog</a>

dontic
  • 63
  • 5