Zum Inhalt springen

NextPDF-Cloudflare-Brücke konfigurieren

Das Paket wird über drei unveränderliche Konfigurationsobjekte gesteuert. Jeder Standardwert auf dieser Seite stammt aus der entsprechenden Konstruktorsignatur in src/Cloudflare/, nicht aus einer Spezifikation oder Schätzung. Wenn diese Seite ein Maximum angibt, ist dieses Maximum ein Limit, das dieses Paket erzwingt. Es sagt nichts über die Plattformkapazität von Cloudflare aus.

Die Renderer-Konfiguration. final readonly. Konstruieren Sie sie direkt oder mit CloudflareRendererConfig::fromArray().

FeldTypStandardBedeutung
workerUrlstring— (erforderlich)URL des Worker-Endpunkts. Sie muss HTTPS verwenden.
apiTokenstring— (erforderlich)Bearer-Token. Mit #[SensitiveParameter] markiert.
renderTimeoutint30Übertragungs-Timeout in Sekunden, angewendet vom gepinnten cURL-Transport.
defaultCssstring''CSS, das vor Ihrem HTML in die Payload injiziert wird.
maxHtmlSizeint5000000Maximale HTML-Eingabegröße in Bytes, die erzwungen wird, bevor die Anfrage gesendet wird.
r2FontBucket?stringnullR2-Bucket-Name für benutzerdefinierte Schriftpakete.
fallbackToLocalbooltrueGibt an, ob bei einem nicht erreichbaren Worker auf einen lokalen Renderer zurückgegriffen wird.
pinnedPublicKeyslist<string>[]SHA-256-SPKI-Fingerabdrücke, Format sha256/<base64>.
backupPublicKeyslist<string>[]Backup-SPKI-Pins, separat vorgehalten, damit die Rotation unabhängig validiert wird.

isValid() gibt nur dann true zurück, wenn workerUrl !== '' und apiToken !== '' gelten. allPublicKeyPins() gibt die deduplizierte Vereinigung von pinnedPublicKeys und backupPublicKeys zurück. Die TLS-Schicht akzeptiert ein Zertifikat, dessen SPKI-Hash in einem beliebigen Element dieser Vereinigung vorkommt. Dies entspricht RFC 7469 §2.6, wonach eine gepinnte Verbindung validiert wird, wenn sich die Menge der präsentierten SPKI-Fingerabdrücke mit der gepinnten Menge überschneidet. RFC 7469 §2.5 beschreibt den Backup-Pin als primären Wiederherstellungsmechanismus, falls die Pin-Validierung versehentlich fehlschlägt. Halten Sie mindestens einen Backup-Pin vor, damit eine Zertifikatsrotation den Endpunkt nicht unbrauchbar macht — siehe /integrations/cloudflare/security-and-operations/.

CloudflareRendererConfig::fromArray() liest snake_case-Schlüssel und verwendet dieselben Standardwerte, wenn ein Schlüssel fehlt oder den falschen Typ hat:

Array-SchlüsselZugeordnet zu
worker_urlworkerUrl
api_tokenapiToken
render_timeoutrenderTimeout (Standard 30)
default_cssdefaultCss
max_html_sizemaxHtmlSize (Standard 5000000)
r2_font_bucketr2FontBucket
fallback_to_localfallbackToLocal (Standard true)
pinned_public_keyspinnedPublicKeys (Nicht-String-Elemente werden verworfen)
backup_public_keysbackupPublicKeys (Nicht-String-Elemente werden verworfen)
<?php
declare(strict_types=1);
use NextPDF\Cloudflare\CloudflareRendererConfig;
$config = CloudflareRendererConfig::fromArray([
'worker_url' => 'https://pdf-renderer.example.workers.dev/render',
'api_token' => getenv('CF_PDF_TOKEN') ?: '',
'render_timeout' => 60,
'r2_font_bucket' => 'pdf-fonts',
'pinned_public_keys' => ['sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg='],
'backup_public_keys' => ['sha256/Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys='],
]);

Diese Limits werden von CloudflareSecurityPolicy::validate() erzwungen, bevor eine Anfrage den Prozess verlässt. Die Zahlen stammen aus dem Quellcode:

LimitWertWo
Maximale HTML-EingabemaxHtmlSize (Standard 5000000 Bytes)CloudflareSecurityPolicy::validate()
Maximale dekodierte base64-Data-URI-Größe13631488 Bytes (≈13 MB)CloudflareSecurityPolicy::MAX_DATA_URI_BYTES

Wenn eines dieser Limits überschritten wird, löst dies eine RuntimeException mit einer Meldung aus, die die beanstandete Größe und das Limit benennt. Die base64-Obergrenze schützt vor Dekompressionsbomben. Die Policy schätzt die dekodierte Größe aus der base64-Länge und weist die Eingabe ab Erreichen der Obergrenze ab. Ein <meta http-equiv="refresh">-Tag wird ebenfalls abgewiesen, unabhängig von der Groß-/Kleinschreibung, weil es eine Weiterleitung aus der gerenderten Seite heraus auslösen kann.

Das Paket nennt nur die Limits, die es selbst erzwingt. Es trifft keine Aussage über die Anfrage-, CPU- oder Speicher-Obergrenzen des Workers selbst. Konsultieren Sie dafür die offizielle Cloudflare-Dokumentation und Ihre Worker-Implementierung.

Konfiguration der optionalen Schutzschicht für Anfragen, die ein Worker — oder ein davor geschaltetes PHP-Gateway — auf eingehende Render-Anfragen anwendet. final readonly.

FeldTypStandardBedeutung
maxRequestsPerMinuteint60Obergrenze für Anfragen pro Client und Minute.
maxRequestsPerHourint1000Obergrenze für Anfragen pro Client und Stunde.
maxPayloadSizeBytesint10485760Maximale eingehende Payload (≈10 MB).
allowedOriginslist<string>[]CORS-Allowlist. Eine leere Liste bedeutet, dass hier keine Origin-Beschränkung festgelegt wird.
requireApiKeybooltrueOb ein API-Schlüssel erforderlich ist.
apiKeyHeaderstring'X-Api-Key'Header, der den API-Schlüssel enthält.
rateLimitWindowSecondsint60Länge des Minutenfensters in Sekunden.

fromArray() liest max_requests_per_minute, max_requests_per_hour, max_payload_size_bytes, allowed_origins, require_api_key, api_key_header und rate_limit_window_seconds. isValid() verlangt, dass alle numerischen Felder positiv sind und apiKeyHeader nicht leer ist.

Konfiguration zur Archivierung gerenderter PDFs in Cloudflare R2 über die S3-kompatible API. final readonly.

FeldTypStandardBedeutung
bucketNamestring— (erforderlich)R2-Bucket. Validiert gegen die S3-Namensregel.
accountIdstring— (erforderlich)Cloudflare-Konto-ID, verwendet zum Erstellen des Standard-Endpunkts.
accessKeyIdstring— (erforderlich)R2-Access-Key-ID. #[SensitiveParameter].
secretAccessKeystring— (erforderlich)Geheimer R2-Access-Key. #[SensitiveParameter].
endpointstring''Benutzerdefinierter S3-Endpunkt. Ist der Wert leer, wird der Standard aus accountId erstellt.
pathPrefixstring'pdfs/'Schlüsselpräfix für hochgeladene Objekte.
maxFileSizeBytesint104857600Maximale Upload-Größe (≈100 MB), die vor dem Upload erzwungen wird.

Der Konstruktor lehnt einen nicht leeren bucketName ab, der nicht der S3-kompatiblen Regel entspricht. Diese Regel lautet: 3–63 Zeichen, nur Kleinbuchstaben, Ziffern und Bindestriche, beginnend und endend mit einem alphanumerischen Zeichen. Ein Verstoß löst InvalidArgumentException aus. isValid() verlangt, dass bucketName, accountId, accessKeyId und secretAccessKey nicht leer sind. Wenn endpoint leer ist, gibt getEndpoint() https://<accountId>.r2.cloudflarestorage.com zurück.

apiToken, accessKeyId und secretAccessKey sind mit dem Attribut #[SensitiveParameter] versehen, sodass PHP sie in Stack-Traces maskiert. Beziehen Sie sie aus Umgebungsvariablen oder einem Secrets-Manager. Nehmen Sie sie niemals in Commits auf. Konfigurationsobjekte sind unveränderlich, sodass ein einmal gesetzter Wert nach der Konstruktion nicht mehr verändert werden kann.

  • /integrations/cloudflare/quickstart/ — wenden Sie diese Konfiguration in einem ersten Render an.
  • /integrations/cloudflare/production-usage/ — Fallback, R2-Archivierung und API-Schutz gemeinsam verdrahten.
  • /integrations/cloudflare/security-and-operations/ — Pinning, SSRF-Abwehr und Geheimnisrotation.