flowingkhaosSign inBrowse the marketplace
New here? flowingkhaos is a build-in-public workshop. This is one part of one of two production failures.What this site is

openFix 02 · part two of five

Context — Astro trailing slash on Cloudflare: fix the 307 and sitemap duplicates

Updated

Context

In August and September 2026 this site moved from a Next.js app on Vercel to a prerendered Astro site on Cloudflare Workers. Every page is built once and served as a static file; the CMS is a shared Payload service read at build time. The old site’s URLs were mapped to the new ones with 301s, the sitemap was registered in Search Console, and the home page ranked for its own name within days.

The first full read of Search Console came on 2026-10-07, five weeks after the cut-over.

What Search Console showed, first read (22:13 UTC)

Fact Number
URLs in the sitemap 26
“Submitted and indexed” 1
“Duplicate without user-selected canonical” 21
“URL is unknown to Google” 4
Impressions, September 28
Clicks, September 1

Every one of the 28 impressions was a query for the name of one workshop.

What the site was doing

Astro’s default build writes column/index.html, and the sitemap integration lists it as /column/. Cloudflare serves a static site’s files with a default it calls auto-trailing-slash: it answers whichever form the file does not match with a redirect to the other, and that redirect is a 307. A 307 means “temporarily moved”: the thing you asked for is still the real address, go here for now. Google takes that literally, keeps both addresses, and picks one. It picked /column, the form every internal link on the site used. The sitemap kept submitting /column/. “Duplicate without user-selected canonical” is the honest verdict for an address that is a copy of one Google already holds, with nothing on the page saying which is which.

Three more faults, all measured on the live site the same day:

  • http://flowingkhaos.com/ answered 200, with no redirect to https:// and no Strict-Transport-Security header. A second pair of addresses for every page.
  • The sitemap had no lastmod on any of its 26 URLs, and no page carried a date anywhere: no JSON-LD, no article:modified_time, no Last-Modified header.
  • 16 of the 26 pages shared one meta description, the default from the site’s base layout. The four stage pages of a fix repeated the parent’s title as their H1.
The column · weekly · free

The next fix, in your inbox the week it happens.

One written column a week. The email service holds the list.

The marketplacePay once

Skip the build. Start from code that ships

Production-ready code under a one-time licence. Buy it, and start building with the code you bought.

  • Pay once
  • Resell what you build
  • No subscription

Luke Sidney writes and builds everything here, alone, in the open. lukesidney.me

Next part · 03 of 05Investigation