تخطَّ إلى المحتوى

إعداد جسر NextPDF لـ Cloudflare

تتحكم في الحزمة ثلاثة كائنات تكوين غير قابلة للتغيير. تُقرأ كل قيمة افتراضية في هذه الصفحة من توقيع الدالة البانية المقابل في src/Cloudflare/، لا من مواصفة ولا من تقدير. وعندما تذكر هذه الصفحة حدًّا أقصى، فذلك الحدّ قيد تفرضه هذه الحزمة، ولا يمثّل بيانًا عن سعة منصة ⁨Cloudflare.⁩

تكوين محرّك العرض. final readonly. أنشئه مباشرةً أو من خلال CloudflareRendererConfig::fromArray().

الحقلالنوعالافتراضيالمعنى
workerUrlstring— (مطلوب)عنوان ⁨URL⁩ لنقطة نهاية ⁨Worker.⁩ يجب أن يستخدم ⁨HTTPS.⁩
apiTokenstring— (مطلوب)رمز ⁨Bearer.⁩ مميّز بـ #[SensitiveParameter].
renderTimeoutint30مهلة النقل بالثواني، يطبّقها ناقل ⁨cURL⁩ المثبَّت.
defaultCssstring''⁨CSS⁩ يُحقن في الحمولة قبل ⁨HTML⁩ الخاص بك.
maxHtmlSizeint5000000الحدّ الأقصى لحجم إدخال ⁨HTML⁩، بالبايت، ويُفرَض قبل إرسال الطلب.
r2FontBucket?stringnullاسم حاوية ⁨R2⁩ لحزم الخطوط المخصصة.
fallbackToLocalbooltrueما إذا كان تعذّر الوصول إلى ⁨Worker⁩ يؤدي إلى الرجوع إلى محرّك عرض محلي.
pinnedPublicKeyslist<string>[]بصمات ⁨SHA-256 SPKI⁩، بالصيغة sha256/<base64>.
backupPublicKeyslist<string>[]تثبيتات ⁨SPKI⁩ احتياطية، تُحفظ منفصلةً حتى يُتحقَّق من التدوير بصورة مستقلة.

تُرجع isValid() القيمة true فقط عندما يكون workerUrl !== '' وapiToken !== ''. وتُرجع allPublicKeyPins() اتحاد pinnedPublicKeys وbackupPublicKeys بعد إزالة التكرارات. تقبل طبقة ⁨TLS⁩ أي شهادة تظهر تجزئة ⁨SPKI⁩ الخاصة بها في أي عضو من ذلك الاتحاد. يطابق هذا ⁨RFC 7469⁩ §2.6، الذي يتحقق من الاتصال المثبَّت عندما تتقاطع مجموعة بصمات ⁨SPKI⁩ المقدَّمة مع المجموعة المثبَّتة. ويصف ⁨RFC 7469⁩ §2.5 التثبيت الاحتياطي بوصفه آلية الاسترداد الأساسية عند حدوث فشل غير مقصود في التحقق من التثبيت. احتفظ بتثبيت احتياطي واحد على الأقل حتى لا يؤدي تدوير الشهادة إلى تعطيل نقطة النهاية — راجع /⁨integrations/cloudflare/security-and-operations/.⁩

تقرأ CloudflareRendererConfig::fromArray() مفاتيح ⁨snake_case⁩ وتطبّق القيم الافتراضية نفسها إذا كان المفتاح غائبًا أو كان نوعه غير صحيح:

مفتاح المصفوفةيُطابق
worker_urlworkerUrl
api_tokenapiToken
render_timeoutrenderTimeout (الافتراضي 30)
default_cssdefaultCss
max_html_sizemaxHtmlSize (الافتراضي 5000000)
r2_font_bucketr2FontBucket
fallback_to_localfallbackToLocal (الافتراضي true)
pinned_public_keyspinnedPublicKeys (تُسقَط الأعضاء غير النصية)
backup_public_keysbackupPublicKeys (تُسقَط الأعضاء غير النصية)
<?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='],
]);

حدود حجم الإدخال التي تفرضها الحزمة

قسم بعنوان «حدود حجم الإدخال التي تفرضها الحزمة»

تفرض CloudflareSecurityPolicy::validate() هذه الحدود قبل أن يغادر أي طلب العملية. وتُقرأ الأرقام من المصدر:

الحدّالقيمةالموضع
الحدّ الأقصى لإدخال ⁨HTML⁩maxHtmlSize (الافتراضي 5000000 بايت)CloudflareSecurityPolicy::validate()
الحدّ الأقصى لحجم ⁨data-URI⁩ بعد فك ترميزه بـ ⁨base64⁩13631488 بايت (≈13 ⁨MB⁩)CloudflareSecurityPolicy::MAX_DATA_URI_BYTES

يؤدي تجاوز أيٍّ منهما إلى رفع RuntimeException برسالة تذكر الحجم المخالف والحدّ. يعمل الحدّ الأقصى لـ ⁨base64⁩ كحاجز ضد قنبلة فكّ الضغط. تقدّر السياسة الحجم بعد فك الترميز من طول ⁨base64⁩، وترفض الطلب عند بلوغ الحدّ أو تجاوزه. كما يُرفض وسم <meta http-equiv="refresh">، بصرف النظر عن حالة الأحرف، لأنه يمكنه دفع إعادة توجيه من داخل الصفحة المعروضة.

لا تذكر الحزمة إلا الحدود التي تفرضها بنفسها. وهي لا تقدّم أي ادّعاء بشأن سقوف ⁨Worker⁩ الخاصة بالطلب أو وحدة المعالجة المركزية أو الذاكرة. راجع وثائق ⁨Cloudflare⁩ الرسمية وتنفيذ ⁨Worker⁩ لديك لمعرفة تلك السقوف.

تكوين طبقة حماية الطلب الاختيارية التي يطبّقها ⁨Worker⁩ — أو بوابة ⁨PHP⁩ أمامه — على طلبات العرض الواردة. final readonly.

الحقلالنوعالافتراضيالمعنى
maxRequestsPerMinuteint60سقف الطلبات لكل عميل في الدقيقة.
maxRequestsPerHourint1000سقف الطلبات لكل عميل في الساعة.
maxPayloadSizeBytesint10485760الحدّ الأقصى للحمولة الواردة (≈10 ⁨MB⁩).
allowedOriginslist<string>[]قائمة السماح لـ ⁨CORS.⁩ تعني القيمة الفارغة عدم التصريح بأي قيد على الأصل هنا.
requireApiKeybooltrueما إذا كان مفتاح ⁨API⁩ مطلوبًا.
apiKeyHeaderstring'X-Api-Key'الترويسة الحاملة لمفتاح ⁨API.⁩
rateLimitWindowSecondsint60طول نافذة الدقيقة، بالثواني.

تقرأ fromArray() max_requests_per_minute، وmax_requests_per_hour، وmax_payload_size_bytes، وallowed_origins، وrequire_api_key، وapi_key_header، وrate_limit_window_seconds. تتطلب isValid() أن يكون كل حقل رقمي موجبًا وأن يكون apiKeyHeader غير فارغ.

تكوين أرشفة ملفات ⁨PDF⁩ المعروضة إلى ⁨Cloudflare R2⁩ عبر ⁨API⁩ المتوافق مع ⁨S3.⁩ final readonly.

الحقلالنوعالافتراضيالمعنى
bucketNamestring— (مطلوب)حاوية ⁨R2.⁩ يُتحقق منها وفق قاعدة تسمية ⁨S3.⁩
accountIdstring— (مطلوب)معرّف حساب ⁨Cloudflare⁩، يُستخدم لبناء نقطة النهاية الافتراضية.
accessKeyIdstring— (مطلوب)معرّف مفتاح وصول ⁨R2.⁩ #[SensitiveParameter].
secretAccessKeystring— (مطلوب)مفتاح الوصول السري لـ ⁨R2.⁩ #[SensitiveParameter].
endpointstring''نقطة نهاية ⁨S3⁩ مخصصة. تبني القيمة الفارغة الإعداد الافتراضي من accountId.
pathPrefixstring'pdfs/'بادئة المفتاح للكائنات المرفوعة.
maxFileSizeBytesint104857600الحدّ الأقصى لحجم الرفع (≈100 ⁨MB⁩)، يُفرَض قبل الرفع.

ترفض الدالة البانية أي bucketName غير فارغ لا يطابق القاعدة المتوافقة مع ⁨S3.⁩ وتنص القاعدة على ما يلي: من 3 إلى 63 حرفًا، من أحرف وأرقام صغيرة وشُرَط، مع البدء والانتهاء بحرف أو رقم. تؤدي المخالفة إلى رفع InvalidArgumentException. تتطلب isValid() أن تكون bucketName، وaccountId، وaccessKeyId، وsecretAccessKey غير فارغة. عندما يكون endpoint فارغًا، تُرجع getEndpoint() القيمة https://<accountId>.r2.cloudflarestorage.com.

يحمل apiToken، وaccessKeyId، وsecretAccessKey سمة #[SensitiveParameter]، بحيث يحجب ⁨PHP⁩ قيمها من آثار المكدس. وفّرها من متغيرات البيئة أو من مدير أسرار، ولا تُودِعها قط في الشيفرة. كائنات التكوين غير قابلة للتغيير؛ فالقيمة التي تُضبط مرةً لا يمكن تغييرها بعد الإنشاء.

  • /⁨integrations/cloudflare/quickstart/⁩ — طبّق هذا التكوين في أول عملية عرض.
  • /⁨integrations/cloudflare/production-usage/⁩ — الرجوع الاحتياطي وأرشفة ⁨R2⁩ وحماية الـ ⁨API⁩ متصلة معًا.
  • /⁨integrations/cloudflare/security-and-operations/⁩ — التثبيت، والدفاع ضد ⁨SSRF⁩، وتدوير الأسرار.