Corriger les URLs propres de Quartz sur Sevalla
Quartz gĂ©nĂšre ses liens internes sans extension : un lien vers cette page pointe vers /dĂ©veloppement/corriger-les-urls-propres-de-quartz-sur-sevalla, jamais vers la mĂȘme adresse en .html. Câest un choix assumĂ© du projet (le type FullSlug est documentĂ© âno file extensionâ) qui laisse Ă lâhĂ©bergeur le soin de faire correspondre /xxx au fichier xxx.html rĂ©ellement gĂ©nĂ©rĂ©.
Sur Sevalla, qui hĂ©berge ce blog, sans rien configurer ça donne une 404 sur le moindre lien interne cliquĂ©. Le fichier existe, mais pas lâURL demandĂ©e.
Pretty URLs
Sevalla propose un toggle âPretty URLsâ dans Static Site â Settings â Redirects, prĂ©vu justement pour ce cas. Je lâai activĂ©, les 404 ont disparu.
Ăa a tenu des mois, jusquâĂ une mise Ă jour de Quartz (le cĆur et les 44 plugins communautaires que jâutilise). AprĂšs avoir poussĂ© les changements, plus aucun style ni script sur le site, sauf sur la page dâaccueil.
Rien ne le signalait dans lâinterface : Sevalla sert sa page 404 personnalisĂ©e avec un statut 200, donc lâĂ©chec des CSS et JS ne se voit quâen ouvrant lâonglet rĂ©seau du navigateur.
En creusant : âPretty URLsâ ne fait pas une réécriture interne, il fait une vraie redirection HTTP vers une URL avec un slash final (/dĂ©veloppement/mon-article/ au lieu de /dĂ©veloppement/mon-article). Or Quartz calcule ses chemins CSS/JS en relatif, en supposant que la page est un fichier : ../component-styles.css remonte Ă la racine depuis lĂ . Avec le slash final, le navigateur traite lâURL comme un dossier, et ../ remonte dâun cran de trop.
Le cache a bien failli me faire tourner en rond pendant le diagnostic : navigateur et Cloudflare, qui est devant Sevalla, cachent les redirections 3xx de façon agressive. Une fois la correction faite cĂŽtĂ© serveur, plusieurs rechargements donnaient encore lâimpression que rien nâavait changĂ©, alors que curl confirmait que si.
Ce qui marche
DĂ©sactiver âPretty URLsâ sur Sevalla, et ajouter un fichier _redirects (le format Netlify, que Sevalla supporte aussi) Ă la racine de public/ :
/* /:splat.html 200
Le 200 fait toute la diffĂ©rence avec une redirection : câest une réécriture cĂŽtĂ© serveur, pas un renvoi au navigateur. Le contenu de xxx.html est servi directement Ă lâURL xxx, qui ne change jamais, donc les chemins relatifs de Quartz restent corrects. LâĂ©quivalent dâun try_files nginx, ou du cleanUrls: true de Vercel.
Je ne maintiens pas ce fichier Ă la main, il est gĂ©nĂ©rĂ© Ă chaque build par un petit plugin Ă©metteur que jâai ajoutĂ© au moteur Quartz (quartz/plugins/emitters/redirects.ts, enregistrĂ© dans quartz/plugins/loader/config-loader.ts).
La mĂȘme mise Ă jour du cĆur Quartz a aussi changĂ© les liens CSS/JS gĂ©nĂ©rĂ©s, de relatifs Ă absolus (/component-styles.css). Le site est donc un peu moins fragile quâavant sur ce genre de souci de profondeur dâURL, mĂȘme si _redirects reste nĂ©cessaire pour les pages elles-mĂȘmes.