Snygga(re) URL:er med Jekyll och Nginx

Jekyll är nästan komplett "out of the box" – men det finns ändå en del saker som saknas, större kontroll över URL:er och bättre hantering av taggar och kategorier är några av dem.

URL:er ja – det finns det många åsikter om vad som är fel, vad som är snyggt och vad Google föredrar.

Jag föredrar permalänkar utan filändelser, och utan avslutande snedstreck ("trailing slash"). Tidigare när jag körde SecondCrack så var det inga som helst problem – då filerna t.o.m. genererades utan filändelser.

Men med Jekyll så är det lite annorlunda; man har stor frihet i hur man vill att ens permalänkar ska se ut så länge som man håller sig inom vissa ramar, t.ex (i _config.yml):

permalink: /:categories/:year/:month/:day/:title/
## /2014/09/18/snygga-urler-i-jekyll/

permalink: /:categories/:year/:month/:day/:title.html
## /2014/09/18/snygga-urler-i-jekyll.html

Detta är de två standardalternativen "pretty" respektive "date", men man kan plocka in en rad olika parametrar tecken efter tycke och smak.

Men då var det ju det att få bort både .html-ändelsen, och det avslutande sedstrecket. Vad vi är ute efter är:

## /2014/09/18/snygga-urler-i-jekyll

På Nginx gör det enklast genom att sätta permalink till pretty, sedan ändra i webbplatsens konfigurationsfil:

rewrite ^/index.html$ / permanent;
rewrite ^(/.+)/$ $1 permanent;
rewrite ^(/.+)/index.html$ $1 permanent;

location / {
    try_files $uri $uri/index.html =404;
}

Så långt är det inga konsigheter, – du kan nu besöka dina sidor utan vare sig ".html" eller "/". Men om du försöker bygga din webbplats med jekyll build nu och kollar på dina permalänkar som genereras via t.ex. {% raw %}{{ post.url }}{% endraw %} i koden så ser du att du fortfarande har ett avslutande snedstreck. Trist. Detta är dessvärre någonting som man behöver plocka bort själv – enklast är förmodligen att skriva ett Liquid-filter. T.ex. så enkelt som:

module LastFilter
    def remove_last( input )
        input.chop
    end
end

Liquid::Template.register_filter(LastFilter)

Lägg i den koden i en .rb-fil i din _plugins-mapp så kan du använda filtret; {% raw %}{{ post.url | remove_last }}{% endraw %} så blir du av med snedstrecket även i koden.