Aller au contenu

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 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.

CapacitéAssurée par
Rendre le HTML en PDF via un Worker CloudflareCloudflareHtmlRenderer::render()
Sonde d’accessibilité (HTTP HEAD)CloudflareHtmlRenderer::isAvailable()
Transport indépendant du fournisseurInjection d’un ClientInterface PSR-18
Durcissement de l’entrée (taille, bombe base64, meta-refresh)CloudflareSecurityPolicy::validate()
Défense contre la SSRF / le DNS-rebindingCloudflareSecurityPolicy::validateWorkerUrl() + assertPinsStillValid()
Épinglage de clé publique TLS et épinglage DNS au niveau de la couche cURLTransport\PinnedCurlTransport
Repli sur Chrome local quand le Worker est injoignableContract\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 R2CloudflareRenderPayload (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 S3R2ArchiveManager

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.

  • 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/core ou 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/).

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éfaut NextPDF\Html\DefaultHtmlSecurityPolicy, fournie par nextpdf/core) : filtrage du contenu au niveau de l’analyse, appliqué avant que le contenu n’atteigne le Worker. Récupère-la avec getHtmlSecurityPolicy().
  • 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.

Un seul appel à render() exécute la séquence observable suivante. Elle est lue directement depuis CloudflareHtmlRenderer::render().

  1. Vérification que la configuration est complète (workerUrl et apiToken non vides). En cas d’échec, le pont se replie sur un moteur de rendu local ou lève CloudflareNotAvailableException.
  2. Validation du HTML par rapport à la taille maximale configurée, au plafond d’URI base64 et à l’interdiction du meta-refresh.
  3. Validation de l’URL du Worker, qui résout l’hôte et renvoie l’ensemble d’adresses IP vérifiées.
  4. Construction de la charge utile (CloudflareRenderPayload).
  5. 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.
  6. La requête HTTP POST est envoyée — via le transport cURL épinglé lorsqu’un ensemble d’adresses IP ou un ensemble d’épingles SPKI existe et qu’une ResponseFactory PSR-17 a été fournie, sinon via le client PSR-18 injecté.
  7. 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.

  • /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.