Ga naar inhoud

Probleemoplossing

De bridge kan drie soorten uitzonderingen veroorzaken. De uitzondering die je opvangt, vertelt wat er is mislukt en of je het opnieuw moet proberen of een fallback moet gebruiken. Elk berichtfragment hieronder komt uit de broncode.

UitzonderingBreidt uitBetekenis
CloudflareNotAvailableExceptionNextPDF\Exception\NextPdfExceptionDe bridge kan de edge niet bereiken of de configuratie is onvolledig, en er is geen bruikbare fallback beschikbaar.
CloudflareRenderExceptionNextPDF\Exception\NextPdfExceptionDe Worker heeft geantwoord, maar de weergave is mislukt (Hypertext Transfer Protocol (HTTP)-fout of onjuist gevormde body). Activeert nooit een fallback.
InvalidSpkiPinExceptionInvalidArgumentExceptionEen geconfigureerde Subject Public Key Info (SPKI)-pinstring is onjuist gevormd.

CloudflareSecurityPolicy gooit ook rechtstreeks RuntimeException bij schendingen van het invoerbeleid en Uniform Resource Locator (URL)-beleid. Dat gebeurt voordat er een verzoek wordt verstuurd.

BerichtfragmentVeroorzaakt doorOorzaakOplossing
incomplete (missing worker_url or api_token)Renderer (via fallbackpad)Ofwel workerUrl ofwel apiToken is leegStel beide in en verifieer vervolgens met isValid().
HTML input exceeds maximum sizeCloudflareSecurityPolicy::validate()De Hypertext Markup Language (HTML)-invoer is langer dan maxHtmlSizeVerklein de invoer, of verhoog maxHtmlSize bewust.
Base64 data URI exceeds safety limitCloudflareSecurityPolicy::validate()Een data:;base64, Uniform Resource Identifier (URI) wordt op meer dan 13631488 bytes geschatPlaats de asset extern; neem grote binaire bestanden niet inline op.
meta-refresh redirect which could cause SSRFCloudflareSecurityPolicy::validate()Een <meta http-equiv="refresh">-tag kan server-side request forgery (SSRF) veroorzakenVerwijder de tag; gebruik een server-side redirect buiten de weergegeven HTML.
Invalid Worker URLvalidateWorkerUrl()De URL kan niet worden geparseerd of mist een scheme/hostGeef een volledige absolute URL op met Hypertext Transfer Protocol Secure (HTTPS).
Worker URL must use HTTPSvalidateWorkerUrl()Het scheme is geen HTTPSGebruik https://.
private or reserved IP addressesvalidateWorkerUrl()Een Internet Protocol (IP)-literal valt binnen Request for Comments (RFC) 1918 / loopback / RFC 3927Verwijs naar een openbaar endpoint.
hostname resolves to a private or reserved IPvalidateWorkerUrl()Een omgezet Domain Name System (DNS) A/AAAA-record is privé of gereserveerdCorrigeer DNS; onderzoek mogelijke rebinding.
DNS answer changed since validationassertPinsStillValid()De host is tussen controle en verzending omgezet naar een nieuw IP-adresVoer de omzetting opnieuw uit; behandel dit als een mogelijke rebindingpoging.

Dit zijn fouten van het type CloudflareRenderException. De Worker heeft geantwoord, maar de weergave zelf is mislukt. Deze activeren nooit de lokale fallback, omdat de edge bereikbaar was.

BerichtfragmentOorzaak
Cloudflare Worker returned HTTP <code>: <detail>Een andere statuscode dan 200. Het detail komt uit het JavaScript Object Notation (JSON)-veld error of de eerste 200 bytes van de body.
Worker returned empty or invalid PDF dataHet binaire antwoord begint niet met %PDF.
Worker error: <message>Een JSON-antwoord dat een error-veld bevat.
JSON response missing "pdf" fieldEen JSON-antwoord zonder pdf-veld.
Invalid base64-encoded PDF in JSON responseHet pdf-veld kan via base64 niet worden gedecodeerd naar bytes die beginnen met %PDF.
Invalid JSON response from WorkerDe body gebruikt Content-Type: application/json, maar kan niet naar een array worden gedecodeerd.
Unexpected Content-Type from Worker: <type>Een 200-antwoord waarbij de Content-Type noch application/pdf noch application/json is.

Wanneer je een van deze opvangt, raadpleeg dan de Worker-logs. De fout ligt aan de Worker-zijde, niet in deze bridge.

Dit zijn fouten van het type CloudflareNotAvailableException. De bridge kon de edge niet gebruiken en geen enkele fallback leverde een Portable Document Format (PDF)-bestand op.

BerichtfragmentOorzaakOplossing
Cloudflare Worker unavailable: <reason>Transportfout terwijl de fallback is uitgeschakeldSchakel fallbackToLocal in en koppel een factory, of herstel de connectiviteit.
Artisan is installed but no LocalRendererFactoryInterface was providednextpdf/artisan is aanwezig, maar er is geen factory doorgegevenGeef een LocalRendererFactoryInterface door aan de constructor.
local Chrome fallback (nextpdf/artisan) is not installedDe fallback is ingeschakeld, er is geen factory geconfigureerd en Artisan ontbreektVoer composer require nextpdf/artisan uit en koppel vervolgens een factory.

Wanneer je een PHP Standards Recommendation (PSR)-3-logger opgeeft en het fallbackpad wordt uitgevoerd, registreert de bridge een warning (Cloudflare render failed, attempting fallback) en vervolgens een info (Falling back to local renderer).

SymptoomOorzaakOplossing
InvalidSpkiPinException: Invalid SPKI pin formatEen pin heeft niet de vorm sha256/<base64> (of sha256//<base64>)Corrigeer de pinstring.
cURL transport error (<n>): <msg>Fout op cURL-niveau (Transport Layer Security (TLS), DNS, time-out)Bekijk het cURL-foutnummer; als er pins zijn ingesteld, controleer dan of de geleverde SPKI nog steeds is gepind.
Weergaven mislukken direct na certificaatrotatieDe SPKI van het nieuwe certificaat staat niet in de pinsetVoeg de nieuwe SPKI als back-uppin toe voordat je roteert.
Gepind transport wordt niet gebruikt ondanks geconfigureerde pinsEr is geen PSR-17 ResponseFactory opgegevenGeef een ResponseFactory door; het gepinde transport vereist dit.

isAvailable() gooit nooit een uitzondering. Het retourneert false wanneer de configuratie ongeldig is of wanneer de HEAD-probe mislukt of een uitzondering gooit. Het retourneert alleen true wanneer de probe reageert met een status lager dan 500. Een resultaat true is slechts een aanwijzing: de daaropvolgende POST kan nog steeds mislukken met een van de fouten aan de Worker-zijde hierboven. Beschouw een geslaagde probe niet als een garantie.

ApiProtection houdt limieten per proces bij in het geheugen. Tellers blijven niet behouden na een herstart en worden niet gedeeld tussen workers of nodes. Als de ene node een client toestaat en een andere deze weigert, is dat te verwachten. Gebruik een gedeelde store voor de limiter voor een clusterbrede limiet.

  • /integrations/cloudflare/security-and-operations/ — het operationele runbook en de beheersmaatregelen achter deze berichten.
  • /integrations/cloudflare/quickstart/ — het canonieke try/catch-patroon.
  • /integrations/cloudflare/production-usage/ — details over het aansluiten van de fallback.