50
A little work log for today: I replaced the client-side random page script with a little server-side endpoint. I just dump it here for reference:
import http from "http";
import { readFile } from "node:fs/promises";
import path from "path";
import { fileURLToPath } from 'url';
let __dirname = path.dirname(fileURLToPath(import.meta.url));
let PORT = 29624;
let commandLineArgs = process.argv.slice(2);
let [
sitemapFile, baseUrl
] = commandLineArgs;
if (!sitemapFile) {
console.error("no sitemap file provided");
process.exit(1);
}
if (!baseUrl) {
console.error("no baseUrl provided");
process.exit(1);
}
const server = http.createServer((request, response) => {
let sitemap = readFile(
path.resolve(__dirname, sitemapFile),
{ encoding: "utf-8" }
);
sitemap.then((sitemapContent => {
let urls = JSON.parse(sitemapContent);
let randomIndex = Math.floor(
Math.random() * urls.length
);
console.log({
Location: baseUrl + urls[randomIndex]
})
response.writeHead(301, {
Location: baseUrl + urls[randomIndex]
});
response.end();
})).catch(() => {
response.writeHead(301, {
Location: baseUrl
});
response.end();
});
});
console.log("starting random-redirecter on port " + PORT);
server.listen(PORT);
I use the nginx front proxy also to ensure that the endpoint to set the cache headers:
location /random-page/ {
proxy_pass http://127.0.0.1:29624/;
proxy_buffering off;
proxy_set_header Host https://$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache';
if_modified_since off;
expires off;
etag off;
}
I also enhanced the intertwingle plugin to generate the JSON file (called a sitemap in the code, but it is only a subset of all URLs as array, if I ever bother to add a sitemap.xml I might want to use that also as a potential input file format for the endpoint). Also I should probably optimize it and cache the file for some time, to not read it with every request. But: one step at a time. Good enough for now.
So: Do you feel lucky, punk? Be my guest: 🎲
Pages which link here: