# Prompt zum Erstellen eines Cloudflare Worker API-Proxys

> Kopieren-Einfügen AI-Prompt zum Erstellen eines Cloudflare Workers, der externe API-Aufrufe proxyt und ratenbegrenzt, Auth-Header hinzufügt und Antworten zwischenspeichert.

**Type:** Prompt  
**Tools:** Cursor, Claude Code, Codex, Windsurf  
**Stack:** Cloudflare, TypeScript  
**Difficulty:** medium  
**Updated:** 2026-06-08

---

Verwenden Sie diesen Prompt, um einen Cloudflare Worker zu erstellen, der vor einer externen API sitzt,
Auth-Header injiziert, das Raten-Limit pro IP mit Workers KV durchsetzt und Antworten zwischenspeichert –
sodass Clients nie Ihren Upstream-API-Schlüssel sehen.

## Haupt-Prompt

```txt title="Main Prompt"
You are building a Cloudflare Worker using TypeScript and the Workers runtime (not Node.js).
The Worker will proxy requests to an upstream API (e.g., OpenAI at https://api.openai.com).

Task: create a production-ready API proxy Worker.

Requirements:
- Use `wrangler` v3 for local dev. Scaffold with `bun create cloudflare@latest` and choose
  "Hello World" Worker with TypeScript.
- Upstream URL: read from a Wrangler secret `UPSTREAM_URL` (string).
- Auth: inject `Authorization: Bearer ${env.UPSTREAM_API_KEY}` on every proxied request,
  where `UPSTREAM_API_KEY` is a Wrangler secret. Never expose this header to the client.
- CORS: allow only origins in `env.ALLOWED_ORIGINS` (comma-separated string secret).
  Return a `403` for disallowed origins. Handle preflight OPTIONS requests.
- Rate limiting: use Workers KV binding `RATE_LIMIT_KV`.
  - Key: `rl:${ip}` where ip is `request.headers.get('CF-Connecting-IP')`.
  - Value: request count for the current UTC minute (TTL = 60 s).
  - Limit: 60 requests/minute per IP. Return `429` with `Retry-After: 60` if exceeded.
- Caching: for GET requests, check `caches.default` before proxying upstream. Cache
  successful responses with `Cache-Control: public, max-age=300`.
- Strip the following headers from the upstream response before returning to the client:
  `x-powered-by`, `server`, `cf-ray`.
- Wrangler config: declare the KV namespace binding and all secrets in `wrangler.toml`.
- Do NOT use Node.js APIs (`fs`, `path`, `Buffer`) — Workers runtime only.

Stop and list all planned files before writing code.
```

## Implementierungshinweise

- Cloudflare Workers empfangen ein `Request` und geben ein `Response` zurück – vermeiden Sie `express`-artige Muster.
- `caches.default` ist der Cloudflare-Edge-Cache; er funktioniert nur in der Produktion. Verwenden Sie `MINIFLARE_CACHE`
  für lokale Entwicklungstests oder mocken Sie den Cache.
- `CF-Connecting-IP` wird von Cloudflare injiziert – es ist vom öffentlichen Internet aus nicht spoofbar, aber
  testen Sie lokal mit einer hartcodierten Fallback-IP.
- Wrangler-Secrets werden mit `wrangler secret put UPSTREAM_API_KEY` gesetzt – speichern Sie sie niemals in
  `wrangler.toml` oder in committed `.env`-Dateien.

## Erwartete Dateiänderungen

```txt
wrangler.toml                  (new)
src/index.ts                   (new — Worker entrypoint)
src/cors.ts                    (new — CORS helper)
src/rate-limit.ts              (new — KV rate limiter)
package.json                   (new)
tsconfig.json                  (new)
.dev.vars                      (new — local dev secrets, gitignored)
.gitignore                     (edited — add .dev.vars)
```

## Akzeptanzkriterien

- `wrangler dev` startet ohne Fehler und leitet einen `GET /` an die Upstream-URL weiter.
- Eine IP, die 61 Anfragen in einer Minute sendet, erhält beim 61. Request einen `429`.
- Eine Anfrage von einer nicht erlaubten Domain erhält einen `403`.
- Der `Authorization`-Header erscheint weder in der Antwort noch in einem client-sichtbaren Header.
- `wrangler deploy` ist erfolgreich und der Worker ist live auf `workers.dev`.

## Testbefehle

```bash
wrangler dev &
# test normal proxy
curl http://localhost:8787/ -H "Origin: https://myapp.com"
# test CORS rejection
curl http://localhost:8787/ -H "Origin: https://evil.com"
# test rate limit (requires 61 rapid requests)
for i in $(seq 1 62); do curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8787/; done
```

## Häufige KI-Fehler

- Verwendung von `process.env` anstelle des `env`-Parameters, der an den Worker-`fetch`-Handler übergeben wird.
- Vergessen, `OPTIONS`-Preflight-Anfragen zu behandeln, was CORS für POST/PUT-Aufrufe unterbricht.
- Speichern von `UPSTREAM_API_KEY` in `wrangler.toml` als einfache Variable anstelle eines Secrets.
- Verwendung von `node:buffer` oder anderen Node.js-Builtins, die in der Workers-Laufzeitumgebung nicht verfügbar sind.

## Fix-Prompt

```txt title="Fix Prompt"
The Worker fails with a runtime error or leaks the API key. Fix in order:
1. Replace `process.env.X` with `env.X` everywhere — Workers use the `env` handler parameter.
2. Add an OPTIONS handler before the proxy logic that returns the CORS headers with a 204 status.
3. Move `UPSTREAM_API_KEY` from `wrangler.toml` [vars] to a secret: `wrangler secret put UPSTREAM_API_KEY`.
Show only the corrected diff.
```