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

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

# 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.