Panduan Cloudflare Workers SEO

cara membuat SEO teknis perubahan pada Cloudflare Workers — fetch handler, HTMLRewriter untuk canonical/hreflang/JSON-LD injection, KV-backed redirects, Cache API vs edge cache vs Cache-Control, cloaking boundary, dan bagaimana bot Fight Mode dapat block Googlebot.

Pertama kali diterbitkan: 3 Jul 2026 · Terakhir diperbarui: 8 Agu 2026 · Advanced
Bahasa
1 sinyal bukti di halaman ini

Cloudflare Workers SEO adalah melakukan SEO teknis pada Cloudflare's serverless runtime: sebuah Worker hanya sees permintaan -nya route matches, dan setiap satu dari itu enters satu fetch handler di mana Anda rewrite permintaan, respons headers, dan respons body. Body rewriting berjalan melalui HTMLRewriter — sebenarnya mechanism untuk injecting sebuah tag canonical, memperbaiki hreflang, atau menambahkan JSON-LD tanpa sebuah CMS deploy — dan ini perlu untuk menjadi idempotent terhadap missing, duplicate, dan non-HTML cases. Redirects di scale belong di KV atau D1; Bulk Redirects/aturan adalah simpler untuk kecil sets, tetapi pick satu owner per URL so sistem jangan conflict. Three terpisah hal share kata cache — Workers Cache API, Cloudflare edge cache, dan origin Cache-Control — dan conflating them adalah mengapa sebuah injected tag seems untuk tidak tampilkan up; diagnose oleh cache key, layer, TTL, dan invalidation. hard aturan adalah cloaking: apply identical logic untuk Googlebot dan pengguna. paling Workers-spesifik self-inflicted wound adalah bot Fight Mode blocking Googlebot pada sebuah pipeline Anda WAF izinkan-aturan jangan bahkan reach. Ship setiap SEO-affecting perubahan dengan recorded versi metadata dan sebuah tested rollback, lalu verify dengan GSC pemeriksaan URL dan CF-Cache-Status header. See Edge SEO hub untuk umum concept.

TL;DR — sebuah Cloudflare Worker hanya sees permintaan cocok oleh -nya configured route, dan ini intercepts setiap satu di sebuah single fetch handler, di mana Anda melakukan three hal di sequence: rewrite permintaan, rewrite respons headers, dan rewrite respons body melalui HTMLRewriter. itu’s nyata mechanism behind “inject a canonical” (terjemahan) “inject sebuah canonical” atau “perbaiki a title” (terjemahan) “perbaiki sebuah judul” — dan ini perlu untuk menjadi idempotent, tested terhadap missing, duplicate, dan non-HTML respons, tidak hanya happy path. Redirects di scale langsung di KV (fast key lookup) atau D1 (relational); Bulk Redirects/aturan cover kecil sets lebih sekadar, dan I umumnya prefer edge-tingkat redirects di atas server-tingkat — tetapi pick satu owner per URL, since sebuah Worker redirect, sebuah Bulk Redirect, dan sebuah origin redirect dapat semua fire pada yang sama path. Three berbeda hal share kata “cache” (terjemahan) “cache” — Workers Cache API (caches.default), Cloudflare edge cache, dan origin Cache-Control — dan confusing them adalah biasa penyebab dari “my tag tidak menunjukkan up” (terjemahan) “my tag tidak tampilkan up”; diagnose staleness oleh cache key, layer, TTL, dan invalidation alih-alih guessing. Google’s own ETag / jika-None-Match / 304 guidance adalah secara langsung actionable untuk sebuah Worker itu owns respons. cloaking line: identical logic untuk setiap requester. paling Workers-spesifik self-inflicted wound adalah bot Fight Mode, yang berjalan di luar WAF Ruleset mesin, so ordinary “izinkan” (terjemahan) “izinkan” aturan jangan reach ini. Ship setiap SEO-affecting perubahan dengan recorded versi metadata, sebuah tested rollback, dan sebuah berhenti condition — lalu verify dengan GSC pemeriksaan URL dan CF-Cache-Status.

Apa ini artikel adalah (dan tidak)

ini adalah practitioner, code-tingkat companion untuk Edge SEO hub. hub owns umum definition, platform perbandingan table (Workers, Akamai, Fastly, Lambda@Edge, Vercel, Netlify), Snippets-vs-Workers decision, dan penuh treatment dari cloaking aturan. I’m tidak re-deriving apa pun dari itu di sini. ini halaman goes satu tingkat deeper ke Cloudflare Workers secara khusus — runtime ini very situs’s own worker berjalan pada, wired di melalui run_worker_first di wrangler.toml — dengan nyata APIs alih-alih “edge compute dapat inject tags” (terjemahan) “edge compute dapat inject tags” hand-waving.

sebuah note sebelum code: Google memiliki Tidak Cloudflare-Workers-spesifik documentation. official guidance itu governs ini (cloaking policy, HTTP caching, CDN crawling) adalah umum dan applies untuk apa pun edge implementation. I’d rather say itu plainly daripada imply sebuah Google doc ada itu tidak.

Bagaimana sebuah Worker sits di permintaan/respons path

sebuah Worker adalah sebuah serverless script berjalan pada V8 isolates. setiap permintaan ini adalah routed untuk enters melalui sebuah fetch handler. Evidence for this claim A Cloudflare Worker receives HTTP requests through a fetch handler. Scope: Cloudflare Workers handlers. Confidence: high · Verified: Cloudflare Workers: Fetch handler “Routed untuk” (terjemahan) “Routed untuk” adalah melakukan nyata berfungsi di itu kalimat: sebuah Worker hanya sees permintaan itu match -nya configured route atau custom domain — semuanya else tidak pernah reaches fetch handler di semua. Di mana dua routes dapat keduanya match yang sama URL, lebih spesifik pattern takes precedence, so sebelum Anda trust sebuah Worker’s perilaku untuk sebuah diberikan URL, konfirmasi route sebenarnya matches ini dan periksa yang deployed versi adalah langsung pada itu route (Wrangler environments dan gradual rollouts berarti versi serving traffic tidak selalu satu di Anda editor). Di dalam handler Anda dapat melakukan three distinct hal, di order:

  1. Rewrite permintaan sebelum ini goes untuk Anda origin.
  2. Rewrite respons headers pada cara back out.
  3. Rewrite respons body — melalui HTMLRewriter.

Di sini’s minimal shape:

export default {
  async fetch(request, env, ctx) {
    // 1. (optionally) inspect/modify the request
    const response = await fetch(request);   // hit the origin

    // 2. rewrite headers
    const headers = new Headers(response.headers);
    headers.set("X-Robots-Tag", "index, follow");

    // 3. rewrite the body with HTMLRewriter (see next section)
    return new Response(response.body, { ...response, headers });
  },
};

SALT.agency team, siapa coined “edge SEO” (terjemahan) “edge SEO” off Cloudflare Workers research, dibangun mereka tooling sebagai sebuah filter chain — sebuah permintaan filter, sebuah respons filter, dan sebuah body filter. itu’s yang sama three-phase pattern; mereka hanya named ini. Mempertahankan itu three phases terpisah di Anda head mempertahankan sebuah Worker legible.

Rewriting HTML dengan HTMLRewriter

HTMLRewriter adalah Cloudflare’s streaming HTML parser, dan ini adalah sebenarnya API behind setiap “inject a tag” (terjemahan) “inject sebuah tag” trick. Evidence for this claim Cloudflare HTMLRewriter provides selector-based handlers that can transform streamed HTML elements. Scope: Cloudflare Workers HTMLRewriter API. Confidence: high · Verified: Cloudflare Workers: HTMLRewriter Anda register .on(selector, handler) element handlers, dan handler mendapatkan getAttribute / setAttribute, prepend / append, setInnerContent, dan replace. Karena ini streams, Anda’re tidak buffering seluruh document di memory.

Injecting atau memperbaiki sebuah tag canonical

class CanonicalHandler {
  constructor(url) { this.url = url; }
  element(el) { el.setAttribute("href", this.url); }
}

const rewriter = new HTMLRewriter()
  .on('link[rel="canonical"]', new CanonicalHandler("https://example.com/preferred/"));

return rewriter.transform(response);

jika halaman memiliki Tidak canonical di semua, Anda attach sebuah handler untuk head dan append satu alih-alih editing sebuah existing tag. Either cara, remember lesson dari canonicalization side dari ini: rel=canonical adalah sebuah hint, tidak sebuah command — sebuah Worker lets Anda set ini consistently di seluruh sebuah seluruh platform, tetapi Google masih decides.

CanonicalHandler di atas assumes sebuah tag sudah ada dan respons adalah HTML. Neither adalah guaranteed di production, dan getting ini wrong adalah bagaimana Anda end up dengan dua tag canonical pada satu halaman alih-alih satu. sebelum Anda ship sebuah rewrite like ini, membuat ini idempotent dan test ini terhadap:

  • Tidak existing canonical — Anda handler perlu untuk detect missing case dan append satu untuk head, tidak silently Tidak-op pada link[rel="canonical"] matching tidak ada apa pun.
  • sebuah duplicate atau malformed canonical sudah present — decide apakah Anda hapus stray tag atau leave Anda rewrite untuk tambahkan sebuah kedua satu ( latter adalah sebuah nyata bug, tidak sebuah edge case — duplicate canonicals adalah sebuah umum self-inflicted issue).
  • sebuah non-HTML respons — sebuah API route, sebuah image, atau sebuah redirect respons lulus melalui sama Worker tidak seharusnya menjadi jalankan melalui HTMLRewriter di semua; cakupan transform untuk routes dan konten jenis Anda’ve sebenarnya diperiksa.
  • Berjalan transform twice pada yang sama respons (sebuah retry, sebuah nested fetch) — konfirmasi ini tidak re-append sebuah kedua tag.

menambahkan atau correcting hreflang alternates

sama mechanism, driven off config. Anda append satu link[rel="alternate"] per locale untuk head. jika Anda alternates adalah per-locale dan relational, itu config belongs di D1; jika ini adalah sebuah flat lookup, KV adalah fine. poin adalah itu HTMLRewriter injects them identically untuk setiap requester — Anda’re tidak branching pada pengguna agent.

Injecting JSON-LD data terstruktur

new HTMLRewriter().on("head", {
  element(head) {
    head.append(
      `<script type="application/ld+json">${JSON.stringify(schema)}</script>`,
      { html: true }
    );
  },
});

CPU limits itu bite di scale

Satu pesaing claim I’d push back pada adalah “sub-millisecond, Tidak constraints.” (terjemahan) “sub-millisecond, Tidak constraints.” nyata ceiling adalah CPU time: 10 ms pada free plan, 30 ms pada paid (wall-clock time menunggu pada fetch tidak count — CPU time melakukan). untuk typical rewrites Anda’ll tidak pernah notice. untuk berat HTMLRewriter melewati di atas very besar halaman, ini adalah sebuah nyata constraint untuk design sekitar, tidak scaremongering.

Redirects di edge: KV vs D1 vs aturan

I typically prefer untuk memiliki redirects pada edge (CDN tingkat) di atas memiliki them pada server — ini offloads berfungsi dari Anda origin dan applies sebelum halaman adalah ever generated. pada Cloudflare secara khusus, di my Ahrefs guide untuk redirects untuk SEO I laid out itu Anda’ve mendapat several options: single atau bulk redirects, redirect aturan, halaman aturan, atau Workers dengan key-nilai pairs — atau sebuah Worker itu modifies headers untuk tambahkan sebuah redirect.

untuk sebuah Worker-driven table, KV adalah natural home: sebuah fast, eventually-consistent key lookup keyed oleh URL.

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const target = await env.REDIRECTS.get(url.pathname);   // KV namespace
    if (target) return Response.redirect(target, 301);
    return fetch(request);
  },
};

Reach untuk D1 ketika redirects adalah relational (per-locale, per-segment SQL Anda ingin kueri). dan know ketika sebuah Worker adalah overkill: untuk sebuah kecil, static set dari redirects, Cloudflare’s Bulk Redirects atau Redirect aturan adalah simpler dan perlu Tidak code di semua. jangan hand-roll sebuah KV Worker untuk fifty redirects.

Pick satu owner untuk sebuah diberikan URL dan jangan let sebuah Worker redirect, sebuah Bulk Redirect, sebuah Redirect aturan, dan sebuah origin redirect semua apply untuk yang sama path — mereka’re terpisah sistem itu dapat setiap fire pada yang sama permintaan, dan ketika lebih daripada satu matches, Anda’re debugging precedence alih-alih sebuah bersih redirect. sebelum Anda tambahkan sebuah redirect anywhere, periksa apakah satu sudah ada untuk itu path di lainnya sistem, dan pick layer berdasarkan match complexity (sederhana 1:1 vs. pattern-based), scale, dan siapa perlu untuk observe atau roll ini back — sebuah Worker redirect lives di Anda code dan logs; sebuah Bulk Redirect atau aturan lives di dashboard dan adalah easier untuk sebuah non-developer untuk audit atau revert.

Caching: three berbeda hal, satu confusing name

ini adalah bagian pesaing halaman skip, dan ini adalah satu itu generates paling “why didn’t my change show up” (terjemahan) “mengapa tidak my perubahan tampilkan up” confusion. Three terpisah layers share kata cache:

  • ** Workers Cache API** — caches.default dan caches.open(). ini adalah sebuah Worker-scoped programmable cache Anda baca dan tulis di code.
  • ** Cloudflare edge cache** — CDN cache itu menyajikan Anda assets. Distinct dari Cache API.
  • Origin Cache-Control — headers Anda origin (atau Anda Worker) sets, yang influence keduanya dari di atas dan apa Googlebot melakukan.

Conflate them dan Anda’ll swear sebuah perubahan tidak deploy ketika ini adalah hanya menjadi disajikan dari sebuah layer Anda tidak purge.

Ketika sebuah perubahan genuinely tidak menunjukkan up, jangan guess — diagnose ini layer oleh layer:

  1. Cache key. Apa permintaan attributes determine apakah dua permintaan hit yang sama cached entry (URL, dan sometimes headers atau cookies jika Anda cache key mencakup them)? sebuah rewrite itu varies oleh sesuatu tidak di cache key dapat sajikan wrong variant.
  2. Yang layer disajikan respons. periksa CF-Cache-Status (HIT/MISS/EXPIRED/DYNAMIC) untuk see apakah edge cache answered di semua, atau permintaan reached Anda Worker.
  3. Location/state. Cloudflare’s cache adalah distributed di seluruh data centers — sebuah purge atau sebuah fresh deploy tidak niscaya invalidate setiap edge location instantly.
  4. TTL dan aturan itu set ini. Konfirmasi apakah sebuah cache aturan, sebuah Cache-Control header dari Anda origin, atau sebuah header Anda Worker itself set adalah controlling TTL.
  5. Invalidation. melakukan Anda purge spesifik URL, purge semuanya, atau rely pada TTL expiry? sebuah Worker-owned Cache API entry (caches.default) perlu -nya own jelas delete() — purging CDN cache tidak touch ini.

Apa Googlebot melakukan dengan ETag / jika-None-Match / 304

jika Anda Worker generates atau rewrites respons, ini owns caching headers — yang berarti Google’s December 2024 HTTP caching guidance adalah secara langsung actionable untuk Anda. Google mendukung heuristic HTTP caching melalui ETag/If-None-Match dan Last-Modified/If-Modified-Since, strongly recommends ETag karena ini adalah lebih sedikit error-prone, dan says itu ketika crawler’s ETag matches, Anda server seharusnya mengembalikan 304 tidak diubah dengan Tidak body. sebuah respons-generating Worker dapat implement persis itu: compute sebuah ETag, bandingkan ini terhadap If-None-Match, dan pendek-circuit untuk sebuah 304 itself — saving compute dan giving Googlebot sebuah fast, cacheable sinyal.

max-age recrawl tradeoff

Google juga says untuk pertimbangkan setting Cache-Control: max-age untuk help crawler decide ketika untuk recrawl. catch untuk sebuah Worker itu rewrites HTML: sebuah aggressive max-age pada sebuah halaman milik siapa Worker-injected tags hanya changed dapat delay Googlebot dari seeing perbarui Anda hanya shipped. jangan slap sebuah panjang cache lifetime pada rewritten HTML dan forget tentang ini.

cloaking boundary, applied untuk Workers

hard aturan, di Workers istilah: jalankan yang sama logic untuk setiap requester. Google’s spam policy defines cloaking sebagai presenting berbeda konten untuk pengguna dan mesin pencari untuk manipulate rankings, dan secara khusus panggilan out inserting text atau keywords hanya ketika requester adalah sebuah mesin pencari.

sebuah couple dari clarifications, karena orang di atas-correct di sini:

  • Inspecting pengguna-Agent tidak secara otomatis cloaking. Logging bot traffic, atau serving sebuah cached respons lebih cepat untuk apa pun client, adalah fine. line adalah sebuah konten perbedaan oleh requester identity, selesai untuk manipulate rankings.
  • halaman-split sebuah/B testing pada Workers adalah fine. Splitting pengguna oleh URL dan treating setiap requester yang sama adalah legitimate. Splitting oleh siapa’s asking — bot vs. human — adalah tidak.

sebuah worked contoh dari safe pattern: ini situs’s own preview gate adalah sebuah Worker itu 404s apa pun /preview/ path unless sebuah cookie matches sebuah secret. ini mengembalikan itu 404 untuk everyone tanpa cookie — Googlebot disertakan. itu’s precisely safe shape: ini tidak hiding satu hal dari bot dan menunjukkan lainnya untuk pengguna; ini applies satu aturan uniformly.

dan jangan lean pada sebuah bot-hanya pre-render langkah bahkan jika Anda bangun ini cleanly pada Workers. Google telah menyebut dynamic rendering sebagai “Dynamic rendering was a workaround and not a long-term solution” (terjemahan) “Perenderan dinamis adalah solusi sementara, bukan solusi jangka panjang” (panduan dynamic rendering); sebuah Worker itu pre-renders hanya untuk bot inherits itu deprecation.

Bagaimana sebuah Worker dapat accidentally block atau slow Googlebot

ini adalah paling Workers-spesifik cara untuk shoot yourself di foot, dan ini adalah biasanya tidak di Anda Worker code.

bot Fight Mode berjalan di luar Ruleset mesin

bot Fight Mode (dan Super bot Fight Mode) dapat produce salah positives terhadap legitimate crawler, Googlebot disertakan. trap: bot Fight Mode adalah evaluated pada sebuah terpisah pipeline dari WAF Ruleset mesin, so Anda ordinary WAF “izinkan” (terjemahan) “izinkan” atau “skip” (terjemahan) “skip” custom aturan jangan override ini. jika bot Fight Mode adalah challenging Googlebot, Anda tidak perbaiki ini dengan sebuah izinkan-aturan — Anda memiliki untuk perubahan atau disable mode itself. (Konfirmasi saat ini mechanics terhadap Cloudflare’s bot Fight Mode dan Super bot Fight Mode docs sebelum Anda rely pada ini — bot products perubahan.)

verified-bot custom aturan pattern

Cloudflare exposes sebuah cf.client.bot field dan sebuah verified-bot izinkan pattern so Anda dapat permit known-baik crawler di Anda custom aturan — berguna untuk WAF side, though (per di atas) ini melakukan tidak reach bot Fight Mode.

CDN itself adalah neutral-untuk-positive

untuk menjadi jelas tentang myth: Cloudflare—CDN tidak hurt SEO. Google’s own 2024 crawling December berfungsi notes itu Google increases laju crawling ketika ini detects sebuah CDN — tetapi itu sebuah CDN dapat juga accidentally block Googlebot melalui WAF/bot aturan, dan itu sebuah 503 adalah better daripada sebuah bot-verification interstitial. risk adalah sebuah misconfigured Worker atau bot setting, tidak infrastructure.

Verifying apa Googlebot sebenarnya diterima

setelah apa pun Worker deploy, konfirmasi apa sebuah crawler sebenarnya mendapat — jangan assume:

  • GSC pemeriksaan URL → Test Langsung URL. Fetches halaman sebagai Google dan menampilkan dirender HTML, so Anda dapat konfirmasi Anda injected canonical/hreflang/JSON-LD adalah sebenarnya present.
  • periksa CF-Cache-Status alongside HTML. HIT / MISS / EXPIRED tells Anda apakah Anda’re looking di sebuah fresh Worker respons atau sebuah cached satu — fastest cara untuk catch sebuah “change didn’t show up” (terjemahan) “perubahan tidak tampilkan up” itu’s benar-benar sebuah cache-layer issue.
  • Fetch sebagai Googlebot secara langsung. permintaan dengan Googlebot’s pengguna agent dan bandingkan — tetapi remember matching string proves tidak ada apa pun tentang identity; verify nyata Googlebot dengan reverse + forward DNS terhadap Google’s published ranges (see Scripts tab).

Deployment hygiene spesifik untuk Workers

sebuah successful wrangler deploy tells Anda script shipped — ini tidak tell Anda Googlebot adalah getting right dirender output. Treat setiap SEO-affecting Worker perubahan sebagai sebuah rilis dengan sebuah record, tidak hanya sebuah push:

  • Cakupan Anda routes. jangan jalankan sebuah Worker pada /* oleh default. Match ini untuk paths ini perlu di Anda wrangler.toml route patterns so sebuah bug dapat’t take down Anda seluruh situs.
  • periksa saat ini limits sebelum Anda promise scale. CPU time, subrequest counts, dan script size limits vary oleh plan dan perubahan di atas time — konfirmasi terhadap Cloudflare’s saat ini limits halaman sebelum Anda design sebuah rewrite sekitar sebuah spesifik ceiling, alih-alih relying pada sebuah remembered angka.
  • Record versi metadata untuk rilis. Cloudflare’s versi dan deployments model tracks sumber versi, compatibility date, bindings, dan routes untuk setiap deploy — note yang versi adalah langsung pada yang route so sebuah “the Worker is doing X” (terjemahan) “ Worker adalah melakukan X” claim adalah checkable terhadap apa sebenarnya deployed, tidak apa di Anda editor.
  • versi dan roll back dengan Wrangler environments. Ship untuk sebuah staging environment, secara bertahap roll out oleh percentage, dan pertahankan ability untuk revert untuk prior versi instantly.
  • gunakan scoped logs untuk monitor rollout — dengan mereka limits di mind. Cloudflare’s Workers Logs dan log tailing dapat mendukung debugging sebuah gradual rollout, tetapi logs adalah sampled dan retained untuk sebuah limited window — treat them sebagai scoped evidence untuk permintaan mereka captured, tidak sebuah menyelesaikan record dari setiap crawler visit.
  • Set sebuah berhenti condition dan test rollback sebelum Anda perlu ini. Decide up front apa observed perilaku (error rate, sebuah wrong respons pada sebuah spot-periksa, sebuah crawl-rate drop) halts rollout, dan konfirmasi rollback path sebenarnya berfungsi alih-alih assuming ini akan.
  • Purge cache sebagai bagian dari deploy. Since three cache layers adalah di play, membuat cache purge/invalidation sebuah jelas langkah dari shipping sebuah rewrite, tidak sebuah afterthought.

sebuah Bing note, dan satu forward-looking hal

Bing memiliki Tidak Cloudflare/edge-spesifik guidance either. tetapi karena sebuah Worker deploy adalah instant sementara melakukan crawl tidak, IndexNow adalah natural pairing — fire ini moment sebuah Worker-driven redirect table atau tag perubahan ships so Bing (dan lainnya participating mesin) re-crawl promptly. dan worth sebuah glance: Cloudflare shipped edge-enforced canonicalization sebagai sebuah product fitur (“Redirects for AI Training” (terjemahan) “Redirects untuk AI Training”) — verified AI-training crawler mendapatkan sebuah 301 untuk Anda canonical URL dengan satu toggle. ini adalah sebuah berguna contrast untuk hand-rolling canonical logic di Anda own Worker, dan sebuah reminder itu “serving crawlers something different from users” (terjemahan) “serving crawler sesuatu berbeda dari pengguna” adalah sebuah pattern Microsoft memiliki publicly telah skeptical dari pada Cloudflare’s lainnya AI-crawler fitur — sebuah baik gut periksa pada apa pun bot-conditional Worker.

untuk lebih luas picture — platform perbandingan, Snippets vs. Workers, dev-queue dan governance angles — head back untuk Edge SEO hub.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.