Migrating From Ghost 2.x to Jekyll, and Nginx Rewrite Rules


I recently migrated my self-hosted instance of a Ghost Blog to Jekyll. Reasons being:

  • Ghost requires a database. Whether SQLite or MariaDB, I didn’t want to host and maintain that, or being restricted with scaling horizontally and syncing data.
  • I’m just hosting a small set of static content, and I want my CDN to more easily cache it without the extra hoops for javascript, which wouldn’t cache everything as I wanted it to.
  • I’m switching to hosting my stuff in the cloud on Kubernetes. And thus, I’ll be using the Nginx Ingress Controller to front everything and terminate TLS.

The earlier versions of Ghost had the prefix to the title of the post be a date (See my post on preserving that setup in later versions of Ghost), When using a converter (more on that in a second), the date prefix to my posts went from /2019/09/07/ to 2019-09-07-. My analytics tanked again (I wung it when I switched).

Post Migration

  • This ruby gem, jekyll_ghost_importer, was the simplest method of migrating posts (using a JSON export from the Ghost Admin Interface as its input).

Nginx Rewrite

  • I first tried using a more k8s-native method, with annotation nginx.ingress.kubernetes.io/rewrite-target, but I kept running into errors.
  • I let Nginx handle the redirect directly itself, through the annotation nginx.ingress.kubernetes.io/configuration-snippet:
    # redirect requests to url's the slashes in dates to dashes
    nginx.ingress.kubernetes.io/configuration-snippet: |
    if ($request_uri ~ "^\/\d{4}\/\d{2}\/\d{2}\/.+") {
      rewrite '^\/(?<year>\d{4})\/(?<month>\d{2})\/(?<day>\d{2})\/(?<remainder>.+)' /$year-$month-$day-$remainder redirect;

    (change redirect to permanent for an HTTP permanent 301 instead of temporary 302 - but test it well first)

Now it redirects as I like: https://andrewaadland.me/2019/06/17/configuring-proxyprotocol-for-nginx-ingress-on-aws/ –> https://andrewaadland.me/2019-06-17-configuring-proxyprotocol-for-nginx-ingress-on-aws/. Google search results no longer return a 404.

This is a preview of Clap Button, a new feedback and analytics tools for Hydejack, built by yours truly. You can try it out on localhost for free, but it will be removed (together with this message) when building with JEKYLL_ENV=production. To use Clap Button on your site, get a subscription
and set clap_button: true in your config file.

© 2021. All rights reserved.