Salta ai contenuti

Risoluzione dei problemi

Il bridge può sollevare tre tipi di eccezione. L’eccezione intercettata indica che cosa è andato storto e se conviene riprovare o attivare un fallback. Ogni frammento di messaggio riportato di seguito è citato dal codice sorgente.

EccezioneEstendeSignificato
CloudflareNotAvailableExceptionNextPDF\Exception\NextPdfExceptionNon è stato possibile raggiungere l’edge, oppure la configurazione è incompleta e non esiste alcun fallback utilizzabile.
CloudflareRenderExceptionNextPDF\Exception\NextPdfExceptionIl Worker ha risposto, ma il rendering è fallito (errore HTTP o corpo malformato). Non attiva mai il fallback.
InvalidSpkiPinExceptionInvalidArgumentExceptionUna stringa configurata per il pin SPKI è malformata.

CloudflareSecurityPolicy solleva inoltre direttamente RuntimeException per le violazioni dei criteri di input e di URL. Lo fa prima che venga inviata qualsiasi richiesta.

Frammento del messaggioSollevata daCausaSoluzione
incomplete (missing worker_url or api_token)Renderer (tramite il percorso di fallback)workerUrl o apiToken vuotoImpostare entrambi; verificare con isValid().
HTML input exceeds maximum sizeCloudflareSecurityPolicy::validate()HTML di lunghezza superiore a maxHtmlSizeRidurre l’input oppure aumentare maxHtmlSize consapevolmente.
Base64 data URI exceeds safety limitCloudflareSecurityPolicy::validate()Un URI data:;base64, stimato oltre i 13631488 byteSpostare l’asset all’esterno; non incorporare binari di grandi dimensioni.
meta-refresh redirect which could cause SSRFCloudflareSecurityPolicy::validate()Un tag <meta http-equiv="refresh">Rimuovere il tag; usare un redirect lato server al di fuori dell’HTML sottoposto a rendering.
Invalid Worker URLvalidateWorkerUrl()L’URL non è parsabile oppure è privo di scheme/hostFornire un URL HTTPS assoluto e completo.
Worker URL must use HTTPSvalidateWorkerUrl()Schema diverso da HTTPSUsare https://.
private or reserved IP addressesvalidateWorkerUrl()Indirizzo IP letterale nell’intervallo RFC 1918 / loopback / RFC 3927Puntare a un endpoint pubblico.
hostname resolves to a private or reserved IPvalidateWorkerUrl()Un record A/AAAA risolto risulta private/reservedCorreggere il DNS; indagare su un possibile rebinding.
DNS answer changed since validationassertPinsStillValid()L’host è stato risolto in un nuovo IP tra il controllo e l’invioRisolvere di nuovo; considerarlo un possibile tentativo di rebinding.

Sono casi di CloudflareRenderException. Il Worker ha risposto, ma il rendering stesso è fallito. Questi errori non attivano mai il fallback locale — l’edge era raggiungibile.

Frammento del messaggioCausa
Cloudflare Worker returned HTTP <code>: <detail>Stato diverso da 200. Il dettaglio proviene dal campo JSON error oppure dai primi 200 byte del corpo.
Worker returned empty or invalid PDF dataRisposta binaria che non inizia con %PDF.
Worker error: <message>Risposta JSON che contiene un campo error.
JSON response missing "pdf" fieldRisposta JSON priva del campo pdf.
Invalid base64-encoded PDF in JSON responseIl campo pdf non è stato decodificato da base64 in byte che iniziano con %PDF.
Invalid JSON response from WorkerContent-Type: application/json ma il corpo non è stato decodificato in un array.
Unexpected Content-Type from Worker: <type>Uno stato 200 il cui Content-Type non è né application/pdfapplication/json.

Se si intercetta uno di questi errori, ispezionare i log del Worker. L’errore è sul lato Worker, non in questo bridge.

Sono casi di CloudflareNotAvailableException. Non è stato possibile usare l’edge e nessun fallback ha prodotto un PDF.

Frammento del messaggioCausaSoluzione
Cloudflare Worker unavailable: <reason>Errore di trasporto, fallback disabilitatoAbilitare fallbackToLocal e collegare una factory, oppure correggere la connettività.
Artisan is installed but no LocalRendererFactoryInterface was providednextpdf/artisan presente, nessuna factory fornitaPassare una LocalRendererFactoryInterface al costruttore.
local Chrome fallback (nextpdf/artisan) is not installedFallback abilitato, nessuna factory, Artisan assentecomposer require nextpdf/artisan e collegare una factory.

Quando viene fornito un logger PSR-3 e viene eseguito il percorso di fallback, il bridge registra prima un warning (Cloudflare render failed, attempting fallback), poi un info (Falling back to local renderer).

SintomoCausaSoluzione
InvalidSpkiPinException: Invalid SPKI pin formatUn pin non nel formato sha256/<base64> (oppure sha256//<base64>)Correggere la stringa del pin.
cURL transport error (<n>): <msg>Errore a livello di cURL (TLS, DNS, timeout)Controllare il numero di errore cURL; se i pin sono configurati, verificare che l’SPKI servito sia ancora associato al pin.
Le operazioni di rendering falliscono immediatamente dopo la rotazione del certificatoL’SPKI del nuovo certificato non è nell’insieme dei pinAggiungere il nuovo SPKI come pin di backup prima della rotazione.
Il trasporto con pinning non viene usato nonostante i pin siano configuratiNessuna ResponseFactory PSR-17 fornitaPassare una ResponseFactory; il trasporto con pinning la richiede.

isAvailable() non solleva mai un’eccezione. Restituisce false quando la configurazione non è valida oppure quando la sonda HEAD fallisce o solleva un’eccezione. Restituisce true solo quando la sonda risponde con uno stato inferiore a 500. Un risultato true è solo indicativo: la successiva POST può comunque fallire con uno qualsiasi degli errori lato Worker indicati sopra. Non considerare una sonda riuscita una garanzia.

Il limitatore ApiProtection mantiene lo stato in memoria per ogni processo. I conteggi non sopravvivono a un riavvio e non sono condivisi tra worker o nodi. Quindi, se si osserva che un client è consentito su un nodo e negato su un altro, è il comportamento atteso. Inserire uno store condiviso prima del limitatore per ottenere un limite a livello di cluster.

  • /integrations/cloudflare/security-and-operations/ — il runbook operativo e i controlli che stanno alla base di questi messaggi.
  • /integrations/cloudflare/quickstart/ — il modello canonico di try/catch.
  • /integrations/cloudflare/production-usage/ — dettagli su come collegare il fallback.