From 74f71612a15bdd815f97cacd61a47a64a27ab6aa Mon Sep 17 00:00:00 2001 From: RGBCube Date: Mon, 9 Jun 2025 15:27:23 +0300 Subject: [PATCH] blog(nginix): fixes --- site.ts | 63 +++++++++++---------- site/assets/css/default.css | 5 ++ site/assets/images/nixpkgs-nginx-etag.webp | Bin 0 -> 32140 bytes site/blog/2025-06-09-nginix.md | 10 ++-- 4 files changed, 45 insertions(+), 33 deletions(-) create mode 100644 site/assets/images/nixpkgs-nginx-etag.webp diff --git a/site.ts b/site.ts index 38ab77b..ba396aa 100644 --- a/site.ts +++ b/site.ts @@ -50,7 +50,7 @@ site.preprocess([".html"], (pages) => site.process([".html"], (pages) => pages.forEach((page) => { - const document = page.document; + const { document } = page; document.querySelectorAll("table").forEach((element) => { const wrapper = document.createElement("div"); @@ -66,36 +66,17 @@ site.process([".html"], (pages) => }); document.querySelectorAll("pre code").forEach((code) => { - const matches = code.innerHTML.match(/\(\(\(\d+\)\)\)/g); - if (matches) { // CALLOUTS - let newHTML = code.innerHTML; + const element = code.parentElement!; + const wrapper = document.createElement("div"); - matches.forEach((match) => { - console.log( - `${match.replaceAll(/\(|\)/g, "")}`, - ); - newHTML = newHTML.replace( - match, - `${match.replaceAll(/\(|\)/g, "")}`, - ); - }); + element.classList.add("transform-[rotateX(180deg)]"); + wrapper.classList.add( + "transform-[rotateX(180deg)]", + "overflow-x-auto", + ); - code.innerHTML = newHTML; - } - - { // ROTATION - const element = code.parentElement!; - const wrapper = document.createElement("div"); - - element.classList.add("transform-[rotateX(180deg)]"); - wrapper.classList.add( - "transform-[rotateX(180deg)]", - "overflow-x-auto", - ); - - element.parentNode!.insertBefore(wrapper, element); - wrapper.appendChild(element); - } + element.parentNode!.insertBefore(wrapper, element); + wrapper.appendChild(element); }); document @@ -195,6 +176,30 @@ site.use(codeHighlight({ }, })); +site.process([".html"], (pages) => + pages.forEach((page) => { + const { document } = page; + + document.querySelectorAll("pre code").forEach((code) => { + const matches = code.innerHTML.match(/\(\(\(\d+\)\)\)/g); + if (!matches) return; + + let newHTML = code.innerHTML; + + matches.forEach((match) => { + console.log( + `${match.replaceAll(/\(|\)/g, "")}`, + ); + newHTML = newHTML.replace( + match, + `${match.replaceAll(/\(|\)/g, "")}`, + ); + }); + + code.innerHTML = newHTML; + }); + })); + site.use(resolveUrls()); site.use(slugifyUrls({ extensions: "*", diff --git a/site/assets/css/default.css b/site/assets/css/default.css index f897e8c..138fb03 100644 --- a/site/assets/css/default.css +++ b/site/assets/css/default.css @@ -284,6 +284,11 @@ body { dark:bg-[#111] dark:shadow-[4px_4px_#bbb]; } + .callout { + @apply px-2.5 py-1 select-none text-white bg-black dark:text-black + dark:bg-white; + } + .token-addition { @apply text-[green] dark:text-[mediumspringgreen]; } diff --git a/site/assets/images/nixpkgs-nginx-etag.webp b/site/assets/images/nixpkgs-nginx-etag.webp new file mode 100644 index 0000000000000000000000000000000000000000..faef292dd78741204acd14e587edc4e00c1ae264 GIT binary patch literal 32140 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 i{TKE8@fFEQ#lgPUVy3)N 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 evYnn1b&Y{RDv9~;*Yt#h*HsK4ApV derived from its inputs] to `1`, which corresponds to January 1st, 1970, > 00:00:01 UTC. -In that case, neither the last modified date or the content length would same. +In that case, neither the last modified date or the content length would change. So the `ETag` header would stay **constant, which would make the client assume the asset has not changed**. @@ -212,7 +212,7 @@ The way this works is as follows: 3. Save the current value of `errno` (ugh) to a local. -4. Then try to resolve `clcf->root.data`. `clcf->root.data` is the path +4. Then we try to resolve `clcf->root.data`. `clcf->root.data` is the path specified in the root directive of the Nginx configuration and could be a symbolic link (e.g., it could be `/var/www` which might be a symlink to a Nix store path[^Please don't do this.]). `ngx_realpath` resolves all symbolic @@ -230,8 +230,8 @@ The way this works is as follows: 7. **The main condition:** We check if the `r->headers_out.last_modified_time` is `1`, which is what Nix sets file's last modified times to, we then check if the canonical path resolution has succeeded (`real != NULL`), if the - canonical path starts with the Nix store path (`NIX_STORE_DIR`), and if it - has anything file after it (`@[next] != '/' && @[next + 1] != NULL`). + canonical path starts with the Nix store path (`NIX_STORE_DIR`), and if the + store path has anything after it (`@[next] != '/' && @[next + 1] != NULL`). 8. (If the condition is true) We then extract the hash. A path like `/nix/store/6bxcxc6xvg5xv70z55adcwhgik5m41a0-package-1.0.0/bin/package` gets @@ -261,3 +261,5 @@ unit).] issues. I hope you learned something in this blog post, and perhaps a new way to fingerprint Nginx installs :). + +![Nixpkgs built Nginx-served ETag header](/assets/images/nixpkgs-nginx-etag.webp)