Bỏ qua để đến nội dung

Khắc phục sự cố

Cầu nối có thể phát sinh ba loại ngoại lệ. Ngoại lệ bạn bắt được cho biết phần nào đã thất bại và nên thử lại hay chuyển sang phương án dự phòng. Mỗi đoạn thông báo dưới đây đều được lấy từ mã nguồn.

Ngoại lệKế thừa từÝ nghĩa
CloudflareNotAvailableExceptionNextPDF\Exception\NextPdfExceptionCầu nối không thể tiếp cận edge, hoặc cấu hình chưa hoàn chỉnh, và không có phương án dự phòng khả dụng.
CloudflareRenderExceptionNextPDF\Exception\NextPdfExceptionWorker đã phản hồi, nhưng quá trình kết xuất thất bại (lỗi Hypertext Transfer Protocol (HTTP) hoặc phần thân sai định dạng). Không bao giờ sử dụng phương án dự phòng.
InvalidSpkiPinExceptionInvalidArgumentExceptionChuỗi pin Subject Public Key Info (SPKI) đã cấu hình có định dạng không hợp lệ.

CloudflareSecurityPolicy cũng phát sinh trực tiếp RuntimeException khi có vi phạm chính sách về đầu vào và Uniform Resource Locator (URL). Ngoại lệ được phát sinh trước khi gửi bất kỳ yêu cầu nào.

Đoạn thông báoPhát sinh bởiNguyên nhânCách khắc phục
incomplete (missing worker_url or api_token)Renderer (qua đường dẫn dự phòng)Hoặc workerUrl hoặc apiToken bị rỗngĐặt cả hai giá trị, rồi xác minh bằng isValid().
HTML input exceeds maximum sizeCloudflareSecurityPolicy::validate()Đầu vào Hypertext Markup Language (HTML) dài hơn maxHtmlSizeRút gọn đầu vào hoặc chủ động tăng maxHtmlSize.
Base64 data URI exceeds safety limitCloudflareSecurityPolicy::validate()Một Uniform Resource Identifier (URI) dạng data:;base64, được ước tính là vượt quá 13631488 byteĐưa tài nguyên ra ngoài; đừng nhúng trực tiếp các tệp nhị phân lớn.
meta-refresh redirect which could cause SSRFCloudflareSecurityPolicy::validate()Một thẻ <meta http-equiv="refresh"> có thể kích hoạt giả mạo yêu cầu phía máy chủ (SSRF)Loại bỏ thẻ đó; dùng chuyển hướng phía máy chủ bên ngoài phần HTML được kết xuất.
Invalid Worker URLvalidateWorkerUrl()URL không phân tích được hoặc thiếu scheme/hostCung cấp một URL tuyệt đối đầy đủ dùng Hypertext Transfer Protocol Secure (HTTPS).
Worker URL must use HTTPSvalidateWorkerUrl()Scheme không phải HTTPSDùng https://.
private or reserved IP addressesvalidateWorkerUrl()Địa chỉ Internet Protocol (IP) dạng literal nằm trong dải Request for Comments (RFC) 1918 / loopback / RFC 3927Trỏ tới một điểm cuối công khai.
hostname resolves to a private or reserved IPvalidateWorkerUrl()Một bản ghi A/AAAA Domain Name System (DNS) phân giải thành địa chỉ riêng tư hoặc dành riêngSửa DNS; điều tra khả năng tấn công rebinding.
DNS answer changed since validationassertPinsStillValid()Host được phân giải sang một địa chỉ IP mới giữa thời điểm kiểm tra và thời điểm gửiPhân giải lại; xem đây là một nỗ lực rebinding có thể xảy ra.

Đây là các lỗi CloudflareRenderException. Worker đã phản hồi, nhưng bản thân quá trình kết xuất thất bại. Những lỗi này không bao giờ kích hoạt phương án dự phòng cục bộ vì edge vẫn tiếp cận được.

Đoạn thông báoNguyên nhân
Cloudflare Worker returned HTTP <code>: <detail>Trạng thái khác 200. Chi tiết được lấy từ trường error trong JavaScript Object Notation (JSON) hoặc 200 byte đầu tiên của phần thân.
Worker returned empty or invalid PDF dataPhản hồi nhị phân không bắt đầu bằng %PDF.
Worker error: <message>Phản hồi JSON có chứa trường error.
JSON response missing "pdf" fieldPhản hồi JSON không có trường pdf.
Invalid base64-encoded PDF in JSON responseKhi giải mã base64, trường pdf không tạo ra các byte bắt đầu bằng %PDF.
Invalid JSON response from WorkerPhần thân dùng Content-Type: application/json, nhưng không giải mã được thành mảng.
Unexpected Content-Type from Worker: <type>Một phản hồi 200 có Content-Type không phải application/pdf cũng không phải application/json.

Khi bắt được một trong những lỗi này, hãy kiểm tra nhật ký Worker. Lỗi nằm ở phía Worker, không phải trong cầu nối này.

Lỗi về khả năng tiếp cận và phương án dự phòng

Phần tiêu đề “Lỗi về khả năng tiếp cận và phương án dự phòng”

Đây là các lỗi CloudflareNotAvailableException. Cầu nối không thể dùng edge, và không có phương án dự phòng nào tạo được tệp Portable Document Format (PDF).

Đoạn thông báoNguyên nhânCách khắc phục
Cloudflare Worker unavailable: <reason>Lỗi truyền tải khi phương án dự phòng đang bị tắtBật fallbackToLocal và kết nối một factory, hoặc khắc phục khả năng kết nối.
Artisan is installed but no LocalRendererFactoryInterface was providednextpdf/artisan có mặt, nhưng không có factory nào được truyền vàoTruyền một LocalRendererFactoryInterface vào constructor.
local Chrome fallback (nextpdf/artisan) is not installedPhương án dự phòng đang bật, không có factory nào được cấu hình, và Artisan không có mặtChạy composer require nextpdf/artisan, rồi kết nối một factory.

Khi bạn cung cấp một logger PHP Standards Recommendation (PSR)-3 và đường dẫn dự phòng chạy, cầu nối ghi một warning (Cloudflare render failed, attempting fallback), sau đó ghi một info (Falling back to local renderer).

Triệu chứngNguyên nhânCách khắc phục
InvalidSpkiPinException: Invalid SPKI pin formatMột pin không ở dạng sha256/<base64> (hoặc sha256//<base64>)Sửa lại chuỗi pin.
cURL transport error (<n>): <msg>Lỗi ở mức cURL (Transport Layer Security (TLS), DNS, hết thời gian chờ)Kiểm tra mã lỗi cURL; nếu pin đã được đặt, hãy xác nhận SPKI đang phục vụ vẫn còn được pin.
Kết xuất thất bại ngay sau khi xoay vòng chứng chỉSPKI của chứng chỉ mới không nằm trong tập pinThêm SPKI mới làm pin dự phòng trước khi xoay vòng.
Truyền tải có pin không được dùng dù đã cấu hình pinKhông có ResponseFactory PSR-17 nào được cung cấpTruyền một ResponseFactory; truyền tải có pin yêu cầu phải có nó.

isAvailable() không bao giờ ném ngoại lệ. Nó trả về false khi cấu hình không hợp lệ, hoặc khi phép thăm dò HEAD thất bại hay phát sinh ngoại lệ. Nó chỉ trả về true khi phép thăm dò phản hồi với trạng thái dưới 500. Kết quả true chỉ là một gợi ý: lệnh POST tiếp theo vẫn có thể thất bại với bất kỳ lỗi phía Worker nào ở trên. Đừng xem một phép thăm dò thành công là sự bảo đảm.

ApiProtection giữ các giới hạn trong bộ nhớ theo từng tiến trình. Số đếm không tồn tại sau khi khởi động lại, và không được chia sẻ giữa các worker hay node. Nếu một node cho phép một client còn node khác từ chối client đó, thì đó là điều bình thường. Đặt một kho chia sẻ phía trước bộ giới hạn để áp dụng giới hạn trên toàn cụm.

  • /integrations/cloudflare/security-and-operations/ — sổ tay vận hành và các biện pháp kiểm soát phía sau những thông báo này.
  • /integrations/cloudflare/quickstart/ — mẫu try/catch chuẩn.
  • /integrations/cloudflare/production-usage/ — chi tiết kết nối phương án dự phòng.