Pont NextPDF de rendu en périphérie pour Cloudflare — vue d'ensemble
nextpdf/cloudflare est un pont de rendu en périphérie. Ton application PHP conserve le HTML, tandis qu’un Worker Cloudflare héberge le navigateur sans interface. Le pont transmet le HTML au Worker via HTTPS et récupère en retour les octets du PDF rendu. Aucun navigateur sans interface ne s’exécute dans ton processus PHP, et aucun binaire Chromium local n’est requis sur le chemin de rendu pris en charge par le pont.
Le paquet fait partie de l’écosystème NextPDF et dépend de nextpdf/core^3.0. Il s’agit de code de protocole filaire : il construit une requête JSON, valide l’entrée et la destination, envoie la requête via un client PSR-18 et analyse la réponse pour produire un objet de résultat typé. L’implémentation du Worker lui-même n’est pas incluse dans ce paquet. Ce pont communique avec un Worker que tu déploies.
La frontière de confiance
Section intitulée « La frontière de confiance »La caractéristique déterminante de ce pont est que le HTML franchit une frontière réseau et atteint un moteur de navigateur que tu ne contrôles pas directement. Chaque contrôle de sécurité du paquet existe en raison de cette frontière.
- Le HTML est validé avant de quitter le processus PHP (
CloudflareSecurityPolicy::validate()). - L’URL de destination est validée avant l’envoi de la requête (
CloudflareSecurityPolicy::validateWorkerUrl()), puis revalidée au moment de la requête pour fermer la fenêtre time-of-check/time-of-use (assertPinsStillValid()). - Le transport peut épingler l’ensemble d’adresses IP résolues et la clé publique du certificat serveur (
Transport\PinnedCurlTransport).
Si tu évalues ce pont en vue d’une mise en production, lis /integrations/cloudflare/security-and-operations/ avant /integrations/cloudflare/quickstart/. Le modèle de sécurité n’est pas une couche ajoutée après coup. C’est la raison pour laquelle le paquet est conçu ainsi.
Ce qu’il fait
Section intitulée « Ce qu’il fait »| Capacité | Assurée par |
|---|---|
| Rendre le HTML en PDF via un Worker Cloudflare | CloudflareHtmlRenderer::render() |
Sonde d’accessibilité (HTTP HEAD) | CloudflareHtmlRenderer::isAvailable() |
| Transport indépendant du fournisseur | Injection d’un ClientInterface PSR-18 |
| Durcissement de l’entrée (taille, bombe base64, meta-refresh) | CloudflareSecurityPolicy::validate() |
| Défense contre la SSRF / le DNS-rebinding | CloudflareSecurityPolicy::validateWorkerUrl() + assertPinsStillValid() |
| Épinglage de clé publique TLS et épinglage DNS au niveau de la couche cURL | Transport\PinnedCurlTransport |
| Repli sur Chrome local quand le Worker est injoignable | Contract\LocalRendererFactoryInterface |
| Analyse des réponses binaires et JSON (base64) | CloudflareResponseParser |
| Télémétrie en périphérie (durée de rendu, emplacement edge, hauteur du contenu) | CloudflareRenderResult |
| Polices personnalisées depuis un bucket R2 | CloudflareRenderPayload (r2FontBucket, fontFiles) |
| Couche de protection de l’API (authentification par clé, taille de charge utile, limitation de débit) | ApiProtection |
| Archivage des PDF vers R2 via l’API compatible S3 | R2ArchiveManager |
Chaque ligne correspond à une classe de l’espace de noms NextPDF\Cloudflare. Chaque ligne est vérifiée d’après le comportement de cette classe et son test, non d’après un document de spécification.
Ce qu’il ne fait pas
Section intitulée « Ce qu’il ne fait pas »- Il n’exécute pas de navigateur. C’est le Worker qui le fait.
- Il ne déploie ni ne configure ton Worker. Cet artefact est à ta charge.
- Il ne signe pas les PDF. La signature relève de
nextpdf/coreou des éditions commerciales. Si tu as besoin d’une signature, effectue d’abord le rendu, puis signe les octets renvoyés avec le moteur. NextPDF Pro fournit la signature PAdES B-B. Les profils de validation à long terme sont une fonctionnalité Enterprise. - Il ne revendique aucune capacité ni limite de la plateforme Cloudflare. Les seules limites de taille et de durée énoncées par cette documentation sont celles que ce paquet applique dans sa propre configuration (voir /integrations/cloudflare/configuration/).
Les deux politiques de sécurité
Section intitulée « Les deux politiques de sécurité »Le pont applique deux politiques distinctes et complémentaires, et les confondre est l’erreur de revue la plus fréquente. Voici chacune d’elles.
- Politique de sécurité HTML (
HtmlSecurityPolicyInterface, par défautNextPDF\Html\DefaultHtmlSecurityPolicy, fournie parnextpdf/core) : filtrage du contenu au niveau de l’analyse, appliqué avant que le contenu n’atteigne le Worker. Récupère-la avecgetHtmlSecurityPolicy(). - Politique de sécurité Cloudflare (
CloudflareSecurityPolicy, statique) : préoccupations de la couche transport — taille de l’entrée, détection des bombes de décompression base64, blocage du meta-refresh, application du HTTPS et défense contre SSRF / DNS-rebinding sur l’URL du Worker.
Le docblock du moteur de rendu énonce lui-même cette séparation. Cette page la rappelle pour que les relecteurs de production aient les deux noms sous les yeux.
Modèle de rendu en périphérie
Section intitulée « Modèle de rendu en périphérie »Un seul appel à render() exécute la séquence observable suivante. Elle est lue directement depuis CloudflareHtmlRenderer::render().
- Vérification que la configuration est complète (
workerUrletapiTokennon vides). En cas d’échec, le pont se replie sur un moteur de rendu local ou lèveCloudflareNotAvailableException. - Validation du HTML par rapport à la taille maximale configurée, au plafond d’URI base64 et à l’interdiction du meta-refresh.
- Validation de l’URL du Worker, qui résout l’hôte et renvoie l’ensemble d’adresses IP vérifiées.
- Construction de la charge utile (
CloudflareRenderPayload). - Nouvelle vérification, au moment de l’utilisation, que la réponse DNS de l’hôte n’a pas changé depuis l’étape 3.
- La requête HTTP
POSTest envoyée — via le transport cURL épinglé lorsqu’un ensemble d’adresses IP ou un ensemble d’épingles SPKI existe et qu’uneResponseFactoryPSR-17 a été fournie, sinon via le client PSR-18 injecté. - La réponse est analysée pour produire un
CloudflareRenderResult.
Tout objet levable autre que CloudflareRenderException déclenche le chemin de repli. CloudflareRenderException (une erreur HTTP ou une réponse malformée du Worker) est relancée telle quelle. C’est une défaillance côté Worker, pas une défaillance d’accessibilité ; il n’y a donc pas de repli.
Voir aussi
Section intitulée « Voir aussi »- /integrations/cloudflare/install/ — installe le paquet et un client PSR-18.
- /integrations/cloudflare/configuration/ — chaque champ de configuration, avec sa valeur par défaut vérifiée dans le code source.
- /integrations/cloudflare/quickstart/ — un premier rendu que tu peux exécuter.
- /integrations/cloudflare/production-usage/ — repli, télémétrie, archivage R2, protection de l’API.
- /integrations/cloudflare/security-and-operations/ — la frontière de confiance dans le détail opérationnel.
- /integrations/cloudflare/troubleshooting/ — modes de défaillance associés aux exceptions.
- /integrations/cloudflare/boot-and-discovery/ — comment le pont s’intègre dans un framework hôte.
- /integrations/cloudflare/integration/ — piloter NextPDF au travers des services Cloudflare.