Przejdź do głównej zawartości

Rozwiązywanie problemów

Most zgłasza trzy typy wyjątków. Przechwycony wyjątek wskazuje, co zawiodło oraz czy należy ponowić próbę, czy skorzystać z rozwiązania zapasowego. Każdy fragment komunikatu poniżej pochodzi z kodu źródłowego.

WyjątekRozszerzaZnaczenie
CloudflareNotAvailableExceptionNextPDF\Exception\NextPdfExceptionMost nie może połączyć się z brzegiem sieci albo konfiguracja jest niekompletna, a użyteczne rozwiązanie zapasowe nie jest dostępne.
CloudflareRenderExceptionNextPDF\Exception\NextPdfExceptionWorker odpowiedział, ale renderowanie zakończyło się niepowodzeniem (błąd protokołu Hypertext Transfer Protocol (HTTP) lub nieprawidłowo sformułowane ciało odpowiedzi). Nigdy nie uruchamia rozwiązania zapasowego.
InvalidSpkiPinExceptionInvalidArgumentExceptionSkonfigurowany ciąg pinu Subject Public Key Info (SPKI) ma nieprawidłowy format.

CloudflareSecurityPolicy zgłasza także bezpośrednio RuntimeException w przypadku naruszeń zasad dotyczących danych wejściowych i adresu Uniform Resource Locator (URL). Zgłasza ten wyjątek przed wysłaniem jakiegokolwiek żądania.

Fragment komunikatuZgłaszany przezPrzyczynaRozwiązanie
incomplete (missing worker_url or api_token)renderer (ścieżką rozwiązania zapasowego)Pole workerUrl lub apiToken jest pusteUstaw oba pola, a następnie zweryfikuj konfigurację za pomocą isValid().
HTML input exceeds maximum sizeCloudflareSecurityPolicy::validate()Dane wejściowe Hypertext Markup Language (HTML) są dłuższe niż maxHtmlSizeZmniejsz dane wejściowe albo świadomie zwiększ maxHtmlSize.
Base64 data URI exceeds safety limitCloudflareSecurityPolicy::validate()Szacowany rozmiar Uniform Resource Identifier (URI) typu data:;base64, przekracza 13631488 bajtówPrzenieś zasób poza treść; nie osadzaj dużych plików binarnych w treści.
meta-refresh redirect which could cause SSRFCloudflareSecurityPolicy::validate()Znacznik <meta http-equiv="refresh"> mógłby umożliwić atak server-side request forgery (SSRF)Usuń ten znacznik; użyj przekierowania po stronie serwera, poza renderowanym kodem HTML.
Invalid Worker URLvalidateWorkerUrl()Adresu URL nie można sparsować albo brakuje w nim scheme/hostPodaj pełny, bezwzględny adres URL używający protokołu Hypertext Transfer Protocol Secure (HTTPS).
Worker URL must use HTTPSvalidateWorkerUrl()Schemat nie jest HTTPSUżyj https://.
private or reserved IP addressesvalidateWorkerUrl()Literał adresu Internet Protocol (IP) należy do zakresu Request for Comments (RFC) 1918 / pętli zwrotnej / RFC 3927Skieruj ruch do publicznego punktu końcowego.
hostname resolves to a private or reserved IPvalidateWorkerUrl()Rekord A/AAAA systemu Domain Name System (DNS) rozwiązuje się do adresu prywatnego lub zarezerwowanegoNapraw DNS; sprawdź możliwość ataku rebinding.
DNS answer changed since validationassertPinsStillValid()Host został rozwiązany do nowego adresu IP między kontrolą a wysłaniemRozwiąż ponownie; potraktuj to jako możliwą próbę ataku rebinding.

To awarie typu CloudflareRenderException. Worker odpowiedział, ale samo renderowanie zakończyło się niepowodzeniem. Nigdy nie uruchamiają lokalnego rozwiązania zapasowego, ponieważ brzeg sieci był osiągalny.

Fragment komunikatuPrzyczyna
Cloudflare Worker returned HTTP <code>: <detail>Status inny niż 200. Szczegóły pochodzą z pola error w formacie JavaScript Object Notation (JSON) lub z pierwszych 200 bajtów ciała odpowiedzi.
Worker returned empty or invalid PDF dataOdpowiedź binarna nie zaczyna się od %PDF.
Worker error: <message>Odpowiedź JSON zawierająca pole error.
JSON response missing "pdf" fieldOdpowiedź JSON bez pola pdf.
Invalid base64-encoded PDF in JSON responsePo zdekodowaniu z base64 pole pdf nie daje bajtów zaczynających się od %PDF.
Invalid JSON response from WorkerCiało odpowiedzi ma Content-Type: application/json, ale po dekodowaniu nie jest tablicą.
Unexpected Content-Type from Worker: <type>Odpowiedź 200, w której Content-Type nie jest ani application/pdf, ani application/json.

Po przechwyceniu jednej z tych awarii sprawdź dzienniki Workera. Problem leży po stronie Workera, a nie w tym moście.

To awarie typu CloudflareNotAvailableException. Most nie mógł skorzystać z brzegu sieci, a żadne rozwiązanie zapasowe nie wytworzyło pliku Portable Document Format (PDF).

Fragment komunikatuPrzyczynaRozwiązanie
Cloudflare Worker unavailable: <reason>Błąd transportu przy wyłączonym rozwiązaniu zapasowymWłącz fallbackToLocal i podłącz fabrykę albo napraw łączność.
Artisan is installed but no LocalRendererFactoryInterface was providednextpdf/artisan jest obecny, ale nie przekazano fabrykiPrzekaż LocalRendererFactoryInterface do konstruktora.
local Chrome fallback (nextpdf/artisan) is not installedRozwiązanie zapasowe jest włączone, nie skonfigurowano fabryki, a Artisan nie jest zainstalowanyUruchom composer require nextpdf/artisan, a następnie podłącz fabrykę.

Gdy dostarczysz rejestrator zgodny z PHP Standards Recommendation (PSR)-3 i uruchomi się ścieżka rozwiązania zapasowego, most zapisze wpis warning (Cloudflare render failed, attempting fallback), a następnie wpis info (Falling back to local renderer).

ObjawPrzyczynaRozwiązanie
InvalidSpkiPinException: Invalid SPKI pin formatPin nie ma postaci sha256/<base64> (ani sha256//<base64>)Popraw ciąg pinu.
cURL transport error (<n>): <msg>Awaria na poziomie cURL (Transport Layer Security (TLS), DNS, przekroczenie limitu czasu)Sprawdź numer błędu cURL; jeśli piny są ustawione, upewnij się, że dostarczany SPKI jest nadal przypięty.
Renderowania zawodzą natychmiast po rotacji certyfikatuSPKI nowego certyfikatu nie znajduje się w zestawie pinówDodaj nowy SPKI jako pin zapasowy przed rotacją.
Transport z przypinaniem nie jest używany mimo skonfigurowanych pinówNie dostarczono fabryki PSR-17 ResponseFactoryPrzekaż ResponseFactory; transport z przypinaniem tego wymaga.

isAvailable() nigdy nie zgłasza wyjątku. Zwraca false, gdy konfiguracja jest nieprawidłowa albo gdy sonda HEAD nie powiedzie się lub zgłosi wyjątek. Zwraca true tylko wtedy, gdy sonda odpowie statusem poniżej 500. Wynik true jest wyłącznie wskazówką: kolejne żądanie POST może mimo to zawieść z powodu dowolnego z powyższych błędów po stronie Workera. Nie traktuj pomyślnej sondy jako gwarancji.

ApiProtection przechowuje limity w pamięci, osobno dla każdego procesu. Liczniki nie przetrwają ponownego uruchomienia i nie są współdzielone między workerami ani węzłami. Jeśli jeden węzeł dopuszcza klienta, a inny mu odmawia, jest to oczekiwane. Umieść współdzielony magazyn przed mechanizmem limitującym, aby uzyskać limit obowiązujący w całym klastrze.

  • /integrations/cloudflare/security-and-operations/ — operacyjny podręcznik oraz mechanizmy kontroli stojące za tymi komunikatami.
  • /integrations/cloudflare/quickstart/ — kanoniczny wzorzec try/catch.
  • /integrations/cloudflare/production-usage/ — szczegóły podłączania rozwiązania zapasowego.