跳到內容

NextPDF Cloudflare 橋接設定

三個不可變的設定物件管理整個套件。本頁列出的每個預設值,都取自 src/Cloudflare/ 中對應的建構式簽章,並非規格或估算值。本頁標示的任何最大值,皆是此套件強制施行的上限,並非對 Cloudflare 平台容量的陳述。

算繪器設定。 final readonly。可直接建構,也可透過 CloudflareRendererConfig::fromArray() 建構。

欄位型別預設值意義
workerUrlstring—(必填)Worker 端點 URL。必須使用 HTTPS。
apiTokenstring—(必填)Bearer token。已標記 #[SensitiveParameter]
renderTimeoutint30傳輸逾時秒數,由固定的 cURL 傳輸層套用。
defaultCssstring''注入酬載中、位於你的 HTML 之前的 CSS。
maxHtmlSizeint5000000最大 HTML 輸入大小(以位元組計),送出請求前會強制檢查。
r2FontBucket?stringnull自訂字型套件使用的 R2 儲存桶名稱。
fallbackToLocalbooltrueWorker 連線失敗時,是否回退到本機算繪器。
pinnedPublicKeyslist<string>[]SHA-256 SPKI 指紋,格式為 sha256/<base64>
backupPublicKeyslist<string>[]備援 SPKI pin,刻意分開保存,便於獨立驗證輪替。

isValid() 僅在 workerUrl !== ''apiToken !== '' 時,才回傳 trueallPublicKeyPins() 回傳 pinnedPublicKeysbackupPublicKeys 去除重複後的聯集。TLS 層會接受其 SPKI 雜湊值出現在該聯集任一成員中的憑證。這符合 RFC 7469 §2.6:當所呈現的 SPKI 指紋集合與已釘選集合相交時,即驗證為已釘選連線。RFC 7469 §2.5 將備援 pin 描述為抵禦意外 pin 驗證失敗的主要復原機制。至少保留一個備援 pin,能避免憑證輪替中斷端點——請見 /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()
解碼後 base64 data-URI 的最大大小13631488 位元組(約 13 MB)CloudflareSecurityPolicy::MAX_DATA_URI_BYTES

超出任一上限都會引發 RuntimeException,訊息會指明違規的大小與上限。base64 上限是防範解壓縮炸彈的護欄。此政策會依 base64 長度估算解碼後大小,並在達到或超過上限時拒絕。<meta http-equiv="refresh"> 標籤也會被拒絕(不分大小寫),因為它可能從算繪頁面內部觸發重新導向。

此套件只陳述它自身強制施行的上限,並未對 Worker 本身的請求、CPU 或記憶體上限做出任何聲明。請查閱 Cloudflare 官方文件與你的 Worker 實作,以了解那些上限。

選用的請求防護層設定,由 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_minutemax_requests_per_hourmax_payload_size_bytesallowed_originsrequire_api_keyapi_key_headerrate_limit_window_secondsisValid() 要求所有數值欄位皆為正數,且 apiKeyHeader 不可為空。

透過 S3 相容 API,將算繪後的 PDF 封存至 Cloudflare R2 的設定。 final readonly

欄位型別預設值意義
bucketNamestring—(必填)R2 儲存桶。會依 S3 命名規則驗證。
accountIdstring—(必填)Cloudflare 帳號 ID,用於建構預設端點。
accessKeyIdstring—(必填)R2 access key ID。 #[SensitiveParameter]
secretAccessKeystring—(必填)R2 secret access key。 #[SensitiveParameter]
endpointstring''自訂 S3 端點。留空時會從 accountId 建構預設端點。
pathPrefixstring'pdfs/'上傳物件的鍵前綴。
maxFileSizeBytesint104857600最大上傳大小(約 100 MB),上傳前會強制檢查。

建構式會拒絕不符合 S3 相容規則的非空 bucketName。該規則為:3 至 63 個字元,小寫英數字與連字號,且以英數字開頭並結尾。違反規則會引發 InvalidArgumentExceptionisValid() 要求 bucketNameaccountIdaccessKeyIdsecretAccessKey 皆不可為空。當 endpoint 為空時,getEndpoint() 回傳 https://<accountId>.r2.cloudflarestorage.com

apiTokenaccessKeyIdsecretAccessKey 帶有 #[SensitiveParameter] 屬性,因此 PHP 會在堆疊追蹤中遮蔽它們。請透過環境變數或密鑰管理器供應這些值。切勿將它們提交到版本控制。設定物件不可變;一旦建立,就無法在建構後再變更。

  • /integrations/cloudflare/quickstart/ — 在首次算繪中套用此設定。
  • /integrations/cloudflare/production-usage/ — 將回退、R2 封存與 API 防護串接在一起。
  • /integrations/cloudflare/security-and-operations/ — 釘選、SSRF 防禦與密鑰輪替。