What is the best approach for redirection of old pages in Jekyll and GitHub Pages?

RedirectGithubJekyllHttp Status-Code-301Github Pages

Redirect Problem Overview


I have blog on github pages - jekyll

What is the best way to solve url strategy migration?

I found the best practice in common is create htaccess like so

Redirect 301 /programovani/2010/04/git-co-to-je-a-co-s-tim/ /2010/04/05/git-co-to-je-a-co-s-tim.html

But it does not seems to work with Github. Another solution i found is create rake task, which will generate redirection pages. But since it's an html, it's not able to send 301 head, so SE crawlers will not recognize it as an redirection.

Redirect Solutions


Solution 1 - Redirect

The best solution is to use both <meta http-equiv="refresh" and <link rel="canonical" href=

It works very well, Google Bot reindexed my entire website under new links without losing positions. Also the users are redirected to the new posts right away.

<meta http-equiv="refresh" content="0; url=http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/">
<link rel="canonical" href="http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/" />

Using <meta http-equiv="refresh" will redirect each visitor to the new post. As for Google Bot, it treats <link rel="canonical" href= as 301 redirect, the effect is that you get your pages reindexed and that is what you want.

I described whole process how I moved my blog from Wordpress to Octopress here. http://konradpodgorski.com/blog/2013/10/21/how-i-migrated-my-blog-from-wordpress-to-octopress/#redirect-301-on-github-pages

Solution 2 - Redirect

Have you tried the Jekyll Alias Generator plugin?

You put the alias urls in the YAML front matter of a post:

---
  layout: post
  title: "My Post With Aliases"
  alias: [/first-alias/index.html, /second-alias/index.html]
---

When a user visits one of the alias urls, they are redirected to the main url via a meta tag refresh:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="refresh" content="0;url=/blog/my-post-with-aliases/" />
  </head>
</html>

See also this blog post on the subject.

Solution 3 - Redirect

redirect-from plugin

https://github.com/jekyll/jekyll-redirect-from#redirect-to

It is supported by GitHub and makes it easy:

_config.yml

gems:
  - jekyll-redirect-from

a.md

---
permalink: /a
redirect_to: 'http://example.com'
---

as explained at: https://help.github.com/articles/redirects-on-github-pages/

Now:

firefox localhost:4000/a

will redirect you to example.com.

The plugin takes over whenever the redirect_to is defined by the page.

Tested on GitHub pages v64.

Note: this version has a serious recently fixed bug which wrongly reuses the default layout for the redirect: https://github.com/jekyll/jekyll-redirect-from/pull/106

Manual layout method

If you don't feel like using https://github.com/jekyll/jekyll-redirect-from it's easy to implement it yourself:

a.md

---
layout: 'redirect'
permalink: /a
redir_to: 'http://example.com'
sitemap: false
---

_layouts/redirect.html based on https://stackoverflow.com/questions/5411538/redirect-from-an-html-page :

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Redirecting...</title>
  {% comment %}
    Don't use 'redirect_to' to avoid conflict
    with the page redirection plugin: if that is defined
    it takes over.
  {% endcomment %}
  <link rel="canonical" href="{{ page.redir_to }}"/>
  <meta http-equiv="refresh" content="0;url={{ page.redir_to }}" />
</head>
<body>
  <h1>Redirecting...</h1>
  <a href="{{ page.redir_to }}">Click here if you are not redirected.<a>
  <script>location='{{ page.redir_to }}'</script>
</body>
</html>

Like this example, the redirect-from plugin does not generate 301s, only meta + JavaScript redirects.

We can verify what is going on with:

curl localhost:4000/a

Solution 4 - Redirect

This solution allows you to use true HTTP redirects via .htaccess — however, nothing involving .htaccess will work on GitHub pages because they do not use Apache.

As of May 2014 GitHub Pages supports redirects, but according to the jekyll-redirect-from Gem documentation they are still based on HTTP-REFRESH (using <meta> tags), which requires full a page load before redirection can occur.

I don't like the <meta> approach so I whipped up a solution for anyone looking to provide real HTTP 301 redirects within an .htaccess file using Apache, which serves a pre-generated Jekyll site:


First, add .htaccess to the include property in _config.yml

include: [.htaccess]

Next, create an .htaccess file and be sure to include YAML front matter. Those dashes are important because now Jekyll will parse the file with Liquid, Jekyll's templating language:

---
---
DirectoryIndex index.html

RewriteEngine On
RewriteBase /

...

Make sure your posts that require redirects have two properties like so:

---
permalink: /my-new-path/
original: blog/my/old/path.php
---

Now in .htaccess, just add a loop:

{% for post in site.categories.post %}
  RewriteRule ^{{ post.original }} {{ post.permalink }} [R=301,L]
{% endfor %}

This will dynamically generate .htaccess every time you build the site, and the include in your config file ensures that .htaccess makes it into _site directory.

RewriteRule ^blog/my/old/path.php /my-new-path/ [R=301,L]

From there, it's up to you to serve _site using Apache. I normally clone the full Jekyll repo into a non-webroot directory, then my vhost is a symlink to the _site folder:

ln -s /path/to/my-blog/_site /var/www/vhosts/my-blog.com

Tada! Now Apache can serve the _site folder from your virtual root, complete with .htaccess-powered redirects that use whichever HTTP response code you desire!

You could even get super fancy and use a redirect property within each post's front matter to designate which redirect code to use in your .htaccess loop.

Solution 5 - Redirect

The best option is to avoid url changes altogether by setting the permalink format in _config.yml to match your old blog.

Beyond that, the most complete solution is generating redirect pages, but isn't necessarily worth the effort. I ended up simply making my 404 page a bit friendlier, with javascript to guess the correct new url. It doesn't do anything for search, but actual users can get to the page they were looking for and there's no legacy stuff to support in the rest of the code.

http://tqcblog.com/2012/11/14/custom-404-page-for-a-github-pages-jekyll-blog/

Solution 6 - Redirect

Since github doesn't allow 301 redirects (which isn't surprising), you'll have to make a decision between moving to your new URL structure (and taking a search engine hit) or leaving the URLs the way they are. I suggest you go ahead and make the move. Let the search engine chips fall where they may. If someone hits one of your old links via the search engine, they'll be redirected to the new location. Over time, the search engines will pick up your changes.

Something you can do to help matters is to create a Sitemap where you only list your new pages and not the old ones. This should speed up the replacement of old URLs with the new ones. Additionally, if all your old URLs are in your '/programovani' directory, you can also use a robots.txt file to tell future crawls they should ignore that directory. For example:

User-agent: *
Disallow: /programovani/

It will take a little while for the search engines to catch up with the changes. This isn't really a big deal. As long as the old URLs still exist and redirect actual people to the active pages, you'll be fine.

Solution 7 - Redirect

As others have mentioned, the best solution is to preserve working URLs or duplicate the pages and specify a canonical URL.

Since github pages doesn't support true redirects, I chose to set up rerouter on Heroku to return 301 (permanent) redirects from my site's old domain to the new one. I described the details here:

http://joey.aghion.com/simple-301-redirects/

Solution 8 - Redirect

Jekyll has gone through some major updates in the past few months, so maybe this wasn't possible when this question was originally posted...

Jekyll supports a permalink attribute in the YAML front-matter section of your blog posts. You can specify the URL that you would like your post to have and Jekyll will use that (instead of the filename) when generating your site.

---
title: My special blog post
permalink: /programovani/2010/04/git-co-to-je-a-co-s-tim
---
My blog post markdown content

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMailo SvětelView Question on Stackoverflow
Solution 1 - RedirectKonrad PodgórskiView Answer on Stackoverflow
Solution 2 - Redirectms-atiView Answer on Stackoverflow
Solution 3 - RedirectCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 4 - RedirectChris RuppelView Answer on Stackoverflow
Solution 5 - RedirectTom ClarksonView Answer on Stackoverflow
Solution 6 - RedirectAlan W. SmithView Answer on Stackoverflow
Solution 7 - RedirectJoeyView Answer on Stackoverflow
Solution 8 - RedirectAndrewView Answer on Stackoverflow