Jekyll on App Engine with beautiful URLs

For my project Waterglass I host a static Jekyll blog on Google App Engine. And of course I want beautiful URLs like¬†/blog/8-cat-pics-that-made-me-smile – but that’s not as automatic on App Engine as on other servers. So here is how you do it.

Jekyll can build your blog having nice URLs. It does this by throwing an index.html file inside your directories. E.g. there is /blog/index.html and /blog/8-cat-pics-that-made-me-smile/index.html. This doesn’t work on App Engine out of the box because it doesn’t have the concept of index documents for static directories. But we can use regular expressions inside URL handlers in the app.yaml file to fake them.

Faking index documents on Google App Engine

Let’s say our blog’s URLs should have this structure: /blog/2014/this-is-the-article-title

We’ll just have to generalize this a bit to match any year and any title and add this handler to our app.yaml:

- url: /blog/(\d{4})/(.*)
  static_files: static/blog/\1/\2/index.html
  upload: static/blog/.*

The url line contains a regex which has two groups. The first matches the year (four digits) and the second matches the remaining characters. In static_files we use these two groups (\1 and \2) to construct the path to the index.html we want to return when someone hits a matching URL. upload finally tells App Engine which files to upload to the server Рin our example everything inside the blog directory.

Now you should also add a handler for /blog – which is really straightforward.

- url: /blog
  static_files: static/blog/index.html
  upload: static/blog/index.html

Voila, you now have beautiful URLs with your Jekyll blog on App Engine.

Want more posts like this one?

I send out emails when I add new posts.

Or follow me on twitter

  • Awesome post. Thanks.

    We use SSL and there is another option you can add to enforce it.
    Just add secure: always

    For example:

    – url: /blog
    static_files: static/blog/index.html
    upload: static/blog/index.html
    secure: always

  • benfreu

    Thanks, good point! That’s an extremely important and very simple change to your handlers.

  • Isaac Almanza

    How did you deploy jekyll in app engine?

  • benfreu

    You actually just generate static files (HTML, etc) and only upload these static files to App Engine.