Przejdź do głównej zawartości

Konfiguracja mostka Cloudflare w NextPDF

Pakiet korzysta z trzech niemutowalnych obiektów konfiguracji. Każda wartość domyślna na tej stronie pochodzi z odpowiadającej jej sygnatury konstruktora w src/Cloudflare/. Nie pochodzi ze specyfikacji ani z szacunków. Tam, gdzie ta strona podaje maksimum, jest to limit, który egzekwuje ten pakiet. Nie jest to informacja o przepustowości platformy Cloudflare.

Konfiguracja rendera. final readonly. Można ją utworzyć bezpośrednio albo za pomocą CloudflareRendererConfig::fromArray().

PoleTypDomyślnieZnaczenie
workerUrlstring— (wymagane)Adres URL punktu końcowego Workera. Musi być HTTPS.
apiTokenstring— (wymagane)Token typu Bearer. Oznaczony jako #[SensitiveParameter].
renderTimeoutint30Limit czasu transferu w sekundach, stosowany przez przypięty transport cURL.
defaultCssstring''CSS wstrzykiwany do ładunku przed kodem HTML.
maxHtmlSizeint5000000Maksymalny rozmiar danych wejściowych HTML w bajtach, egzekwowany przed wysłaniem żądania.
r2FontBucket?stringnullNazwa zasobnika R2 na niestandardowe pakiety czcionek.
fallbackToLocalbooltrueOkreśla, czy nieosiągalny Worker przełącza się na lokalny render.
pinnedPublicKeyslist<string>[]Odciski palca SPKI SHA-256, w formacie sha256/<base64>.
backupPublicKeyslist<string>[]Zapasowe przypięcia SPKI, trzymane osobno, aby rotacja była weryfikowana niezależnie.

isValid() zwraca true tylko wtedy, gdy workerUrl !== '' oraz apiToken !== ''. allPublicKeyPins() zwraca sumę zbiorów pinnedPublicKeys oraz backupPublicKeys, bez duplikatów. Warstwa TLS akceptuje certyfikat, którego skrót SPKI występuje w dowolnym elemencie tej sumy. Jest to zgodne z RFC 7469 §2.6, który uznaje przypięte połączenie za prawidłowe, gdy zbiór przedstawionych odcisków palca SPKI przecina się ze zbiorem przypiętym. RFC 7469 §2.5 opisuje przypięcie zapasowe jako podstawowy mechanizm odzyskiwania na wypadek niezamierzonego niepowodzenia walidacji przypięcia. Zachowaj co najmniej jedno przypięcie zapasowe, aby rotacja certyfikatu nie uszkodziła punktu końcowego — zobacz /integrations/cloudflare/security-and-operations/.

CloudflareRendererConfig::fromArray() odczytuje klucze w formacie snake_case i stosuje te same wartości domyślne, gdy klucza brakuje albo ma niewłaściwy typ:

Klucz tablicyMapuje się na
worker_urlworkerUrl
api_tokenapiToken
render_timeoutrenderTimeout (domyślnie 30)
default_cssdefaultCss
max_html_sizemaxHtmlSize (domyślnie 5000000)
r2_font_bucketr2FontBucket
fallback_to_localfallbackToLocal (domyślnie true)
pinned_public_keyspinnedPublicKeys (elementy niebędące łańcuchami znaków są pomijane)
backup_public_keysbackupPublicKeys (elementy niebędące łańcuchami znaków są pomijane)
<?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='],
]);

Limity rozmiaru danych wejściowych egzekwowane przez pakiet

Dział zatytułowany „Limity rozmiaru danych wejściowych egzekwowane przez pakiet”

Te limity egzekwuje CloudflareSecurityPolicy::validate(), zanim jakiekolwiek żądanie opuści proces. Liczby są odczytywane ze źródła:

LimitWartośćGdzie
Maksymalne dane wejściowe HTMLmaxHtmlSize (domyślnie 5000000 bajtów)CloudflareSecurityPolicy::validate()
Maksymalny rozmiar zdekodowanego identyfikatora URI danych base6413631488 bajtów (≈13 MB)CloudflareSecurityPolicy::MAX_DATA_URI_BYTES

Przekroczenie któregokolwiek z nich powoduje zgłoszenie RuntimeException z komunikatem podającym niedozwolony rozmiar oraz limit. Pułap base64 zabezpiecza przed bombą dekompresyjną. Polityka szacuje rozmiar zdekodowanych danych na podstawie długości base64 i odrzuca je po osiągnięciu pułapu albo jego przekroczeniu. Znacznik <meta http-equiv="refresh"> również jest odrzucany, bez rozróżniania wielkości liter, ponieważ może wywołać przekierowanie z wnętrza renderowanej strony.

Pakiet podaje wyłącznie limity, które sam egzekwuje. Nie formułuje żadnych twierdzeń o właściwych Workerowi limitach żądań, procesora ani pamięci. Zajrzyj w tym celu do oficjalnej dokumentacji Cloudflare oraz do implementacji swojego Workera.

Konfiguracja opcjonalnej warstwy ochrony żądań, którą Worker — albo bramka PHP umieszczona przed nim — stosuje do przychodzących żądań renderowania. final readonly.

PoleTypDomyślnieZnaczenie
maxRequestsPerMinuteint60Limit żądań na klienta na minutę.
maxRequestsPerHourint1000Limit żądań na klienta na godzinę.
maxPayloadSizeBytesint10485760Maksymalny ładunek przychodzący (≈10 MB).
allowedOriginslist<string>[]Lista dozwolonych źródeł CORS. Pusta oznacza, że nie zdefiniowano tu żadnego ograniczenia źródła.
requireApiKeybooltrueOkreśla, czy klucz API jest wymagany.
apiKeyHeaderstring'X-Api-Key'Nagłówek przenoszący klucz API.
rateLimitWindowSecondsint60Długość okna na minutę, w sekundach.

fromArray() odczytuje max_requests_per_minute, max_requests_per_hour, max_payload_size_bytes, allowed_origins, require_api_key, api_key_header oraz rate_limit_window_seconds. isValid() wymaga, aby każde pole liczbowe było dodatnie, a apiKeyHeader — niepuste.

Konfiguracja archiwizacji renderowanych plików PDF w Cloudflare R2 przez interfejs API zgodny z S3. final readonly.

PoleTypDomyślnieZnaczenie
bucketNamestring— (wymagane)Zasobnik R2. Walidowany według reguły nazewnictwa S3.
accountIdstring— (wymagane)Identyfikator konta Cloudflare, używany do zbudowania domyślnego punktu końcowego.
accessKeyIdstring— (wymagane)Identyfikator klucza dostępu R2. #[SensitiveParameter].
secretAccessKeystring— (wymagane)Tajny klucz dostępu R2. #[SensitiveParameter].
endpointstring''Niestandardowy punkt końcowy S3. Pusty buduje wartość domyślną na podstawie accountId.
pathPrefixstring'pdfs/'Prefiks klucza przesyłanych obiektów.
maxFileSizeBytesint104857600Maksymalny rozmiar przesyłanego pliku (≈100 MB), egzekwowany przed przesłaniem.

Konstruktor odrzuca niepuste bucketName, które nie pasuje do reguły zgodnej z S3. Reguła ta wymaga od 3–63 znaków, małych liter alfanumerycznych oraz łączników, z początkiem i końcem na znaku alfanumerycznym. Naruszenie powoduje zgłoszenie InvalidArgumentException. isValid() wymaga, aby bucketName, accountId, accessKeyId oraz secretAccessKey były niepuste. Gdy endpoint jest pusty, getEndpoint() zwraca https://<accountId>.r2.cloudflarestorage.com.

apiToken, accessKeyId oraz secretAccessKey mają atrybut #[SensitiveParameter], więc PHP usuwa je ze śladów stosu. Przekazuj je przez zmienne środowiskowe lub menedżera danych poufnych. Nigdy nie umieszczaj ich w repozytorium. Obiekty konfiguracji są niemutowalne, więc raz ustawionej wartości nie można zmienić po utworzeniu.

  • /integrations/cloudflare/quickstart/ — zastosuj tę konfigurację przy pierwszym renderze.
  • /integrations/cloudflare/production-usage/ — przełączanie awaryjne, archiwizacja R2 oraz ochrona API połączone w jedną całość.
  • /integrations/cloudflare/security-and-operations/ — przypinanie, obrona przed SSRF oraz rotacja danych poufnych.