Hướng dẫn về Cloudflare Workers SEO

Cách làm SEO kỹ thuật thay đổi on Cloudflare Workers — đó fetch handler, HTMLRewriter cho canonical/hreflang/JSON-LD injection, KV-được hỗ trợ các chuyển hướng, đó Bộ nhớ đệm API so với edge bộ nhớ đệm so với Cache-Control, đó cloaking boundary, và cách Bot Fight Chế độ có thể block Googlebot.

Xuất bản lần đầu: 3 thg 7, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này

Cloudflare Workers SEO là đang làm SEO kỹ thuật on Cloudflare's serverless runtime: một Worker chỉ sees các yêu cầu của nó route matches, và mỗi một of những enters một fetch handler nơi bạn rewrite đó yêu cầu, đó các header phản hồi, và đó thân phản hồi. Thân phản hồi rewriting chạy qua HTMLRewriter — đó thực tế mechanism cho injecting một canonical tag, sửa hreflang, hoặc thêm JSON-LD không có một CMS deploy — và điều này cần to là idempotent so với missing, duplicate, và non-HTML cases. Các chuyển hướng tại scale belong trong KV hoặc D1; Bulk Các chuyển hướng/Rules là simpler cho nhỏ sets, nhưng pick một owner per URL so các hệ thống không conflict. Three tách biệt điều share đó word bộ nhớ đệm — đó Workers Bộ nhớ đệm API, đó Cloudflare edge bộ nhớ đệm, và origin Cache-Control — và conflating them là vì sao an injected tag seems to không cho thấy up; diagnose by bộ nhớ đệm key, layer, TTL, và invalidation. Đó hard rule là cloaking: apply giống hệt logic cho Googlebot và người dùng. Đó hầu hết Workers-cụ thể self-inflicted wound là Bot Fight Chế độ blocking Googlebot on một pipeline của bạn WAF cho phép-rules không even reach. Ship mỗi SEO-affecting thay đổi với recorded version metadata và một tested rollback, thì verify với GSC URL Inspection và đó CF-Bộ nhớ đệm-Status header. See đó Edge SEO hub cho đó chung concept.

TL;DR — MỘT Cloudflare Worker chỉ sees các yêu cầu khớp by của nó configured route, và điều này intercepts mỗi một trong một single fetch handler, nơi bạn làm three điều trong sequence: rewrite đó yêu cầu, rewrite đó các header phản hồi, và rewrite đó thân phản hồi qua HTMLRewriter. đó là đó real mechanism behind “inject a canonical” (bản dịch) «inject một canonical» hoặc “cách sửa một tiêu đề” — và điều này cần to là idempotent, tested so với missing, duplicate, và non-HTML các phản hồi, không chỉ đó happy path. Các chuyển hướng tại scale trực tiếp trong KV (fast key lookup) hoặc D1 (relational); Bulk Các chuyển hướng/Rules cover nhỏ sets hơn đơn giản, và I generally ưu tiên edge-level các chuyển hướng over máy chủ-level — nhưng pick một owner per URL, since một Worker chuyển hướng, một Bulk Chuyển hướng, và an origin chuyển hướng có thể all fire on đó giống nhau path. Three khác nhau điều share đó word “bộ nhớ đệm” — đó Workers Bộ nhớ đệm API (caches.default), đó Cloudflare edge bộ nhớ đệm, và origin Cache-Control — và confusing them là đó thông thường nguyên nhân of “my tag didn’t show up” (bản dịch) «my tag đã không cho thấy up»; diagnose staleness by bộ nhớ đệm key, layer, TTL, và invalidation thay vì guessing. Google own ETag / If-None-Match / 304 hướng dẫn là trực tiếp actionable cho một Worker đó owns đó phản hồi. Đó cloaking line: giống hệt logic cho mỗi requester. Đó hầu hết Workers-cụ thể self-inflicted wound là Bot Fight Chế độ, mà chạy bên ngoài đó WAF Ruleset Engine, so ordinary “cho phép” rules không reach điều này. Ship mỗi SEO-affecting thay đổi với recorded version metadata, một tested rollback, và một dừng condition — thì verify với GSC URL Inspection và CF-Cache-Status.

Điều gì điều này bài viết là (và không phải)

Này là đó practitioner, code-level companion to đó Edge SEO hub. Đó hub owns đó chung definition, đó nền tảng so sánh bảng (Workers, Akamai, Fastly, Lambda@Edge, Vercel, Netlify), đó Snippets-so với-Workers decision, và đó đầy đủ treatment of đó cloaking rule. I’m không re-deriving any of đó ở đây. Này trang goes một level deeper vào Cloudflare Workers cụ thể — đó runtime này very site own worker chạy on, wired trong qua run_worker_first trong wrangler.toml — với real APIs thay vì “edge compute can inject tags” (bản dịch) «edge compute có thể inject tags» hand-waving.

note trước khi code: Google có không Cloudflare-Workers-cụ thể tài liệu. chính thức hướng dẫn đó governs điều này (cloaking policy, HTTP bộ nhớ đệm, CDN crawling) là chung và áp dụng để bất kỳ edge implementation. I’d rather say đó plainly hơn imply Google doc tồn tại đó không.

Cách Worker sits trong yêu cầu/phản hồi path

Worker là serverless script đang chạy on V8 isolates. mỗi yêu cầu nó routed để enters qua 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 to” là đang làm thực hoạt động trong đó sentence: Worker chỉ sees các yêu cầu đó match của nó configured route hoặc custom domain — mọi thứ khác không bao giờ reaches fetch handler tại all. nơi hai routes có thể cả hai match giống nhau URL, nhiều hơn cụ thể pattern takes precedence, so trước khi bạn trust Worker behavior cho được cho URL, xác nhận route thực ra matches nó và kiểm tra mà deployed version là trực tiếp on đó route (Wrangler environments và gradual rollouts có nghĩa là version serving traffic không phải luôn một trong của bạn editor). Bên trong handler Bạn có thể làm three distinct điều, trong order:

  1. Rewrite yêu cầu trước khi nó goes để của bạn origin.
  2. Rewrite phản hồi các header on way back out.
  3. Rewrite phản hồi thân phản hồi — qua HTMLRewriter.

Ở đây 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, ai coined “edge SEO” off Cloudflare Workers research, được xây dựng của họ tooling as filter chain — yêu cầu filter, phản hồi filter, và thân phản hồi filter. đó giống nhau three-phase pattern; họ chỉ named nó. Giữ những điều đó three phases tách biệt trong của bạn head giữ Worker legible.

Rewriting HTML với HTMLRewriter

HTMLRewriter là Cloudflare’s streaming HTML parser, và đây là đó thực tế API behind mỗi “inject a tag” (bản dịch) «inject một 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 Bạn register .on(selector, handler) element handlers, và đó handler nhận getAttribute / setAttribute, prepend / append, setInnerContent, và replace. Vì điều này streams, bạn là không buffering đó toàn bộ document trong memory.

Injecting hoặc sửa thẻ 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);

nếu trang có không canonical tại all, bạn attach handler để headappend một thay vì editing existing tag. Either way, remember lesson từ canonicalization side của điều này: rel=canonical là hint, không command — Worker lets bạn đặt nó consistently across toàn bộ nền tảng, nhưng Google vẫn decides.

CanonicalHandler trên assumes tag đã tồn tại và phản hồi là HTML. Neither là guaranteed trong production, và getting nó sai là Cách bạn end up với hai canonical tags on một trang thay vì một. trước khi bạn ship rewrite like điều này, làm nó idempotent và kiểm thử nó so với:

  • Không existing canonical — của bạn handler cần để detect missing case và append một để head, không silently không-op on link[rel="canonical"] matching không có gì.
  • ** duplicate hoặc malformed canonical đã present** — quyết định liệu bạn xóa stray tag hoặc leave của bạn rewrite để thêm thứ hai một ( latter là thực bug, không edge case — duplicate canonicals là phổ biến self-inflicted vấn đề).
  • ** non-HTML phản hồi** — API route, image, hoặc chuyển hướng phản hồi đã truyền qua giống nhau Worker không nên là chạy qua HTMLRewriter tại all; phạm vi transform để routes và nội dung types bạn’ve thực ra checked.
  • Đang chạy transform twice on giống nhau phản hồi ( retry, nested fetch) — xác nhận nó không re-append thứ hai tag.

Thêm hoặc correcting hreflang alternates

giống nhau mechanism, driven off config. bạn append một link[rel="alternate"] per locale để head. nếu của bạn alternates là per-locale và relational, đó config belongs trong D1; nếu nó flat lookup, KV là fine. point là đó HTMLRewriter injects them identically cho mỗi requester — bạn’re không branching on người dùng agent.

Injecting JSON-LD dữ liệu có cấu trúc

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

CPU limits đó bite tại scale

Một đối thủ claim I’d push back on là “sub-millisecond, no constraints.” (bản dịch) «sub-millisecond, không constraints.» Đó real ceiling là CPU time: 10 ms on đó free plan, 30 ms on paid (wall-clock time đang chờ on fetch không count — CPU time làm). Cho typical rewrites bạn’ll không bao giờ notice. Cho nặng HTMLRewriter truyền over very lớn các trang, đây là một real constraint to design khoảng, không scaremongering.

Các chuyển hướng tại edge: KV so với D1 so với Rules

I typically ưu tiên để có các chuyển hướng on edge (CDN level) over có them on máy chủ — nó offloads hoạt động từ của bạn origin và áp dụng trước khi trang là bao giờ generated. On Cloudflare cụ thể, trong my Ahrefs hướng dẫn để các chuyển hướng Đối với SEO I laid out đó bạn’ve đã nhận several options: single hoặc bulk các chuyển hướng, chuyển hướng rules, trang rules, hoặc Workers với mấu chốt-giá trị pairs — hoặc Worker đó modifies các header để thêm chuyển hướng.

cho Worker-driven bảng, KV là natural home: fast, eventually-consistent mấu chốt lookup keyed by 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 cho D1 Khi các chuyển hướng là relational (per-locale, per-segment SQL bạn muốn để query). và know Khi Worker là overkill: cho nhỏ, static đặt của các chuyển hướng, Cloudflare’s Bulk Các chuyển hướng hoặc chuyển hướng Rules là simpler và cần không code tại all. không hand-roll KV Worker cho fifty các chuyển hướng.

Pick một owner cho được cho URL và không let Worker chuyển hướng, Bulk chuyển hướng, chuyển hướng Rule, và origin chuyển hướng all apply để giống nhau path — họ’re tách biệt các hệ thống đó có thể mỗi fire on giống nhau yêu cầu, và Khi nhiều hơn hơn một matches, bạn’re gỡ lỗi precedence thay vì sạch chuyển hướng. trước khi bạn thêm chuyển hướng anywhere, kiểm tra liệu một đã tồn tại cho đó path trong khác các hệ thống, và pick layer dựa trên match complexity (đơn giản 1:1 so với. pattern-based), scale, và ai cần để observe hoặc roll nó back — Worker chuyển hướng lives trong của bạn code và nhật ký; Bulk chuyển hướng hoặc Rule lives trong dashboard và là easier cho non-nhà phát triển để audit hoặc revert.

bộ nhớ đệm: three khác điều, một confusing name

Này là đó section đối thủ các trang skip, và đây là đó một đó generates đó hầu hết “why didn’t my change show up” (bản dịch) «vì sao đã không my thay đổi cho thấy up» confusion. Three tách biệt layers share đó word bộ nhớ đệm:

  • ** Workers bộ nhớ đệm API** — caches.defaultcaches.open(). Đây là Worker-scoped programmable bộ nhớ đệm bạn đọc và ghi trong code.
  • ** Cloudflare edge bộ nhớ đệm** — CDN bộ nhớ đệm đó phục vụ của bạn assets. Distinct từ bộ nhớ đệm API.
  • Origin Cache-Control — các header của bạn origin (hoặc của bạn Worker) sets, mà influence cả hai của trên và Điều gì Googlebot làm.

Conflate them và bạn’ll swear thay đổi đã không deploy Khi nó chỉ là served từ layer bạn đã không purge.

Khi thay đổi genuinely không phải cho thấy up, không guess — diagnose nó layer by layer:

  1. bộ nhớ đệm mấu chốt. Điều gì yêu cầu các thuộc tính determine liệu hai các yêu cầu hit giống nhau được lưu đệm entry (URL, và đôi khi các header hoặc cookies nếu của bạn bộ nhớ đệm mấu chốt bao gồm them)? rewrite đó varies by điều gì đó không trong bộ nhớ đệm mấu chốt có thể phục vụ sai variant.
  2. Mà layer served phản hồi. kiểm tra CF-Cache-Status (HIT/MISS/EXPIRED/DYNAMIC) để see liệu edge bộ nhớ đệm answered tại all, hoặc yêu cầu reached của bạn Worker.
  3. Location/state. Cloudflare’s bộ nhớ đệm là distributed across dữ liệu centers — purge hoặc fresh deploy không nhất thiết invalidate mỗi edge location instantly.
  4. TTL và rule đó đặt nó. xác nhận liệu bộ nhớ đệm rule, Cache-Control header từ của bạn origin, hoặc header của bạn Worker itself đặt là controlling TTL.
  5. Invalidation. Đã làm bạn purge cụ thể URL, purge mọi thứ, hoặc rely on TTL expiry? Worker-owned bộ nhớ đệm API entry (caches.default) cần của nó own rõ ràng delete() — purging CDN bộ nhớ đệm không touch nó.

Điều gì Googlebot làm với ETag / nếu-None-Match / 304

nếu của bạn Worker generates hoặc rewrites phản hồi, nó owns bộ nhớ đệm các header — mà có nghĩ là Google December 2024 HTTP bộ nhớ đệm hướng dẫn là trực tiếp actionable cho bạn. Google hỗ trợ heuristic HTTP bộ nhớ đệm qua ETag/If-None-MatchLast-Modified/If-Modified-Since, strongly khuyến nghị ETag vì nó ít hơn lỗi-prone, và nói đó Khi crawler ETag matches, của bạn máy chủ nên trả về 304 Chư sử đổi với không thân phản hồi. phản hồi-generating Worker có thể implement chính xác đó: compute ETag, so sánh nó so với If-None-Match, và ngắn-circuit để 304 itself — saving compute và giving Googlebot fast, có thể lưu vào bộ nhớ đệm tín hiệu.

max-age recrawl tradeoff

Google cũng nói để cân nhắc setting Cache-Control: max-age để help các crawler quyết định Khi để recrawl. catch cho Worker đó rewrites HTML: aggressive max-age trên một trang whose Worker-injected tags chỉ changed có thể delay Googlebot từ seeing cập nhật bạn chỉ shipped. không slap dài bộ nhớ đệm lifetime on rewritten HTML và forget về nó.

cloaking boundary, applied để Workers

hard rule, trong Workers terms: chạy giống nhau logic cho mỗi requester. Google spam policy defines cloaking as presenting khác nội dung để người dùng và các công cụ tìm kiếm để manipulate thứ hạng, và cụ thể calls out inserting text hoặc từ khóa chỉ Khi requester là công cụ tìm kiếm.

couple của clarifications, vì mọi người over-đúng ở đây:

  • Inspecting Người dùng-Agent không phải tự động cloaking. Logging bot traffic, hoặc serving được lưu đệm phản hồi nhanh hơn để bất kỳ client, là fine. line là nội dung khác biệt by requester identity, đã xong để manipulate thứ hạng.
  • trang-split /B kiểm thử on Workers là fine. Splitting người dùng by URL và treating mỗi requester giống nhau là legitimate. Splitting by ai asking — bot so với. human — không phải.

worked ví dụ của safe pattern: điều này trang web own preview gate là Worker đó 404s bất kỳ /preview/ path trừ khi cookie matches secret. nó trả về đó 404 để mọi người không có cookie — Googlebot được bao gồm. đó precisely safe shape: nó không phải hiding một điều từ bots và cho thấy một để người dùng; nó áp dụng một rule uniformly.

và không lean on bot-chỉ pre-render step even nếu bạn xây dựng nó cleanly on Workers. Google có được gọi là dynamic rendering workaround và không dài-term giải pháp; Worker đó pre-renders chỉ cho bots inherits đó deprecation.

Cách Worker có thể accidentally block hoặc chậm Googlebot

Đây là phần lớn Workers-cụ thể way để shoot yourself trong foot, và nó thường không trong của bạn Worker code.

Bot Fight Chế độ chạy bên ngoài Ruleset Engine

Bot Fight Chế độ (và Super Bot Fight Chế độ) có thể produce sai positives so với legitimate các crawler, Googlebot được bao gồm. trap: Bot Fight Chế độ là evaluated on tách biệt pipeline từ WAF Ruleset Engine, so của bạn ordinary WAF “cho phép” hoặc “skip” custom rules không override nó. nếu Bot Fight Chế độ là challenging Googlebot, bạn không khắc phục nó với cho phép-rule — bạn có để thay đổi hoặc disable chế độ itself. (xác nhận hiện tại mechanics so với Cloudflare’s Bot Fight Chế độSuper Bot Fight Chế độ tài liệu trước khi bạn rely on nó — bot các sản phẩm thay đổi.)

verified-bots custom rule pattern

Cloudflare exposes cf.client.bot trường và verified-bots cho phép pattern so Bạn có thể permit known-good các crawler trong của bạn custom rules — hữu ích cho WAF side, though (per trên) nó không reach Bot Fight Chế độ.

CDN itself là neutral-để-positive

để là clear về myth: Cloudflare—CDN không hurt SEO. Google own 2024 Crawling December hoạt động notes đó Google increases tốc độ crawl Khi nó detects CDN — nhưng đó CDN có thể cũng accidentally block Googlebot qua WAF/bot rules, và đó 503 là tốt hơn hơn bot-verification interstitial. risk là misconfigured Worker hoặc bot setting, không infrastructure.

Verifying Điều gì Googlebot thực ra đã nhận

sau khi bất kỳ Worker deploy, xác nhận Điều gì crawler thực ra đã nhận — không assume:

  • GSC URL Inspection → Kiểm thử Trực tiếp URL. Fetches đó trang as Google và cho thấy đó được kết xuất HTML, so bạn có thể xác nhận của bạn injected canonical/hreflang/JSON-LD là thực ra present.
  • Kiểm tra CF-Cache-Status alongside đó HTML. HIT / MISS / EXPIRED tells bạn liệu bạn là looking tại một fresh Worker phản hồi hoặc một được lưu đệm một — đó fastest way to catch một “change didn’t show up” (bản dịch) «thay đổi đã không cho thấy up» đó là thực sự một bộ nhớ đệm-layer vấn đề.
  • Fetch as Googlebot trực tiếp. Yêu cầu với Googlebot’s người dùng agent và so sánh — nhưng remember matching đó string proves không có gì về identity; verify real Googlebot với reverse + forward DNS so với Google published ranges (see đó Scripts tab).

Deployment hygiene cụ thể để Workers

thành công wrangler deploy tells bạn script shipped — nó không tell bạn Googlebot là getting right được kết xuất output. Treat mỗi SEO-affecting Worker thay đổi as phát hành với record, không chỉ push:

  • Phạm vi của bạn routes. không chạy một Worker on /* theo mặc định. Match điều này to đó paths điều này cần trong của bạn wrangler.toml route patterns so một bug không thể take down của bạn toàn bộ site.
  • Kiểm tra hiện tại limits trước khi bạn promise scale. CPU time, subrequest được tính, và script size limits vary by plan và thay đổi theo thời gian — xác nhận so với Cloudflare’s hiện tại limits trang trước khi bạn design một rewrite khoảng một cụ thể ceiling, thay vì relying on một remembered number.
  • Record version metadata cho đó phát hành. Cloudflare’s versions và deployments model tracks đó nguồn version, compatibility date, bindings, và routes cho mỗi deploy — note mà version là trực tiếp on mà route so một “the Worker is doing X” (bản dịch) «đó Worker là đang làm X» claim là checkable so với điều gì là thực ra deployed, không điều gì là trong của bạn editor.
  • Version và roll back với Wrangler environments. Ship to một staging environment, dần dần roll out by percentage, và giữ đó ability to revert to đó prior version instantly.
  • Dùng scoped logs to monitor đó rollout — với của họ limits trong mind. Cloudflare’s Workers Logs và log tailing có thể hỗ trợ gỡ lỗi một gradual rollout, nhưng logs là sampled và retained cho một limited window — treat them as scoped evidence cho đó các yêu cầu they captured, không một hoàn tất record of mỗi crawler visit.
  • Set một dừng condition và kiểm thử đó rollback trước khi bạn cần điều này. Decide up front điều gì observed behavior (lỗi rate, một wrong phản hồi on một spot-kiểm tra, một crawl-rate drop) halts đó rollout, và xác nhận đó rollback path thực ra hoạt động thay vì assuming điều này sẽ.
  • Purge bộ nhớ đệm as part of đó deploy. Since three bộ nhớ đệm layers là trong play, làm bộ nhớ đệm purge/invalidation an rõ ràng step of shipping một rewrite, không an afterthought.

Bing note, và một forward-looking điều

Bing có không Cloudflare/edge-cụ thể hướng dẫn either. Nhưng vì một Worker deploy là instant trong khi crawl không, IndexNow là đó natural pairing — fire điều này đó moment một Worker-driven chuyển hướng bảng hoặc tag thay đổi ships so Bing (và other participating engines) re-crawl promptly. Và worth một glance: Cloudflare shipped edge-enforced canonicalization as một sản phẩm feature (“Redirects for AI Training” (bản dịch) «Các chuyển hướng cho AI Training») — verified AI-training các crawler nhận một 301 to của bạn canonical URL với một toggle. đây là một hữu ích contrast to hand-rolling canonical logic trong của bạn own Worker, và một reminder đó “serving crawlers something different from users” (bản dịch) «serving các crawler điều gì đó khác nhau từ người dùng» là một pattern Microsoft có publicly đã skeptical of on Cloudflare’s other AI-crawler features — một good gut kiểm tra on any bot-conditional Worker.

cho rộng hơn picture — nền tảng so sánh, Snippets so với. Workers, dev-queue và governance angles — head back để Edge SEO hub.

Add an expert note

Pin an expert quote

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