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

openFix 02 · five parts

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

Search Console said 1 of 26 pages indexed. The site answered every address twice, with and without a trailing slash, joined by a 307: Google kept the slashless pages and filed the sitemap's slash addresses as duplicates. The pages were indexed all along; the sitemap was the only thing that did not know. The repair: one URL form everywhere, a permanent redirect at the zone, HTTPS with HSTS, a sitemap the site writes itself with a true lastmod, and one dated schema.org graph on every page.

Stack
Cloudflare Workers · Astro · Payload · Search Console
Apps affected
flowingkhaos
Cost
0 USD in services; about two sessions of work (estimate). The real cost is five weeks with one page in the index.
Opened
7 Oct 2026
Updated
Source
Private repository — excerpts and screenshots only

At a glance

  1. What brokeThe sitemap's 26 addresses were refused: 21 filed as duplicates of the slashless pages Google had already indexed, 4 unknown. Six hours later, with the sitemap corrected: 24 of 26 indexed. 28 impressions in September, all for one workshop's name; 1 click.
  2. Found bySearch Console index report, read by the OSI search-read script
  3. Where it standsStill open. The log says so, and the write-up grows as the repair does.

The story

The sitemap told Google about 26 addresses, and Google refused 25 of them: 21 as duplicates, 4 as unknown. The pages themselves were fine. They were indexed at a slightly different address, the one without the trailing slash, and the sitemap was the only thing on the site that did not know it.

The short version

  • The symptom. Search Console, read on 2026-10-07: 26 URLs in the sitemap, 1 “submitted and indexed”, 21 “duplicate without user-selected canonical”, 4 “unknown to Google”. 28 impressions in September, every one of them for the name of one workshop. One click.
  • The cause. Every page answered at two addresses, /column/ and /column, and the site sent one to the other with a 307, a temporary redirect. A temporary redirect tells Google to keep both. Google chose the slashless form and indexed it; the sitemap submitted the slash form, so every sitemap URL was a duplicate of a page Google already had. Under that: http:// answered 200 with no redirect to https://, no URL in the sitemap carried a date, and no page carried a date, an author or any structured data at all.
  • The repair. The sitemap, the canonical and every link in one form, slashless. A permanent redirect on the trailing slash and on http://, set where the answer is actually produced (the Cloudflare zone, before any code runs). A sitemap the site writes itself, with the CMS row’s updatedAt on every URL. One schema.org graph on every page with the author and both dates. A description of its own on every page.
  • The first receipt. The same read, six hours later, against the corrected sitemap: 24 of 26 “submitted and indexed”, 2 unknown. The pages were there all along; now the sitemap says so too.

What was actually lost

Not the index. Five weeks of Google reading a sitemap it could not use, with no date on anything and no author anywhere, while the site’s whole case for existing is to be found by people who build with AI and stall before production. Its growth gate (300 subscribers or 2,000 monthly readers by 2026-12-05) does not move on 28 impressions a month. This fix cleared the plumbing. The 28 is the next fix.

The evidence

The trace is rough while the fix is open. It runs straight from the repair on.

  1. Opened

    Search Console index report read by script: 26 URLs, 1 indexed, 21 duplicate without user-selected canonical, 4 unknown to Google.

    receipt · raw/keywords/track/flowingkhaos/2026-10/index.csv
  2. Diagnosis

    First attempt: canonical on every page, one URL form, build format 'file'. Deployed; /column/ still 307 on production at 23:00. The redirect is Cloudflare's assets layer, not the site.

  3. Diagnosis

    Live crawl of the 26 URLs: http:// 200 with no HSTS; 0 pages with JSON-LD, an author or a date; 16 of 26 share one description. The 307 can only become a 301 as a Redirect Rule on the zone.

  4. Repair

    Built on a branch: HSTS header file, a site-written sitemap with lastmod on 23 of 26 URLs, one schema.org graph per page with author and dates, a description and H1 per page, nofollow on sign-in links. 265 tests pass. Waits on the merge and on the two zone settings.

    receipt · live-CMS build: 26 URLs / 23 lastmod; wrangler preview curled
  5. Diagnosis

    Live crawl of the 26 URLs: http:// 200 with no HSTS; 0 pages with JSON-LD, an author or a date; 16 of 26 share one description. The 307 can only become a 301 as a Redirect Rule on the zone.

  6. Repair

    Built on a branch: HSTS header file, a site-written sitemap with lastmod on 23 of 26 URLs, one schema.org graph per page with author and dates, a description and H1 per page, nofollow on sign-in links. 265 tests pass. Waits on the merge and on the two zone settings.

    receipt · live-CMS build: 26 URLs / 23 lastmod; wrangler preview curled
  7. Diagnosis

    Second Search Console read against the slashless sitemap: 24 of 26 submitted and indexed (crawled 19–29 Sept), 2 unknown. The first read's '1 of 26' described the sitemap's slash addresses, not the pages. Correction written into every page of this fix.

    receipt · raw/keywords/track/flowingkhaos/2026-10/index.csv, inspected 2026-10-08T00:22:38Z
  8. Repair

    Merged to main (ecd4c3c) and deployed. Measured on production: 23 lastmod in sitemap-0.xml, TechArticle on a fix stage, HSTS header on /. Zone redirect rule and Always Use HTTPS still the operator's.

    receipt · curl on flowingkhaos.com, 2026-10-08 ~01:00 UTC

The rule I changed after

Read Search Console within a week of any cut-over, not five weeks after. And inspect the address Google chose, not the address you submitted: a URL Inspection report answers for the sitemap's mistake, not the site's reach.

Keep reading

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 · 02 of 05Context