Eigene Download-URLs erstellen

Deine Kunden sollten die PDFs von deiner Domäne herunterladen können. Wenn Kunden eine Domäne nicht kennen, verweigern Sie die Downloads.
Hier geht es zur Anleitung, wie du das machst.

Kunden sind zunehmends sensibel, wenn sie eine URL nicht als die von der Organisation erstellten URL erkennen können. Kennt ein Kunde TailorPDF nicht, könnte es vorkommen, dass ein Download nicht angeklickt wird.

Ziel PDfs von https://deinesubdomäne.deinedomäne.com/download/nnnnnnnn herunter laden können.
statt von https://tailorpdf.com/download/nnnnnnnn.

Mit folgendem Script kannst du auf einer eigenen Subdomäne ein Script hinterlegen, das es dir erlaubt die PDFs via deine Website zu laden.
Der Vorteil liegt darin, dass die Benutzer nicht erkennen können, dass die PDFs eigentlich auf TailorPDF.com generiert werden.

Voraussetzungen

  1. PHP mit CURL – eine aktuelle Version ab PHP 8.3
  2. Eine eigene Subdomain z.B download.deinedomäne.com oder pdf.deinedomäne.com.
    Du bist frei in der Wahl. In der regel ist es besser eine eigene Subdomäne dafür zu verwenden.
    Ein kleiner Nachteil: Du musst auf der Subdomäne ebenfalls ein Certifikat installieren, damit die Site über https:// zugegriffen werden kann.
    Glücklicherweise gibt es Zertifikate, die sich gratis installieren lassen.
  3. Der Webserver sollte Rewrites erlauben.
    Damit realisieren wir eine Weiterleitung von https://subdomäne.deinedomäne.com/download/nnnnnnnn
    auf https://subdomäne.deinedomäne.com/get.php?id=nnnnnnnn
    wobei nnnnnnn für die ID des Dokuments steht.
  4. Das Script erledigt den Rest.
<?php
// Name der Datei: get.php
// Name of file: get.php

// 2025 TailorPDF @ Rösch Informatik GmbH

// TailorPDF PDF Weiterleitungs-Skript
// Anforderungen PHP mit cURL Erweiterung wird benötigt.
// Stelle dieses Script an eine Subdomain wie pdf.yourdomain.com
// setze .htaccess so, dass alle Anfragen an dieses Script weitergeleitet werden.
// Beispiel .htaccess Regel:
//    RewriteEngine On 
//    # forward of /download/ID to get.php?id=ID
//    RewriteRule ^download/([a-zA-Z0-9]+)$ get.php?id=$1 [L,QSA]

// TailorPDF redirecting PDF script
// Requires PHP with cURL extension.
// set this script to a subdomain like pdf.yourdomain.com
// set .htaccess to forward all requests to this script.
// example .htaccess rule:
//    RewriteEngine On 
//    # forward of /download/ID to get.php?id=ID
//    RewriteRule ^download/([a-zA-Z0-9]+)$ get.php?id=$1 [L,QSA]

// ID aus URL holen, get Parameter id
$id = $_GET['id'] ?? '';

// Validierung: Nur alphanumerische Zeichen erlauben
// validation of id: only alphanumeric characters allowed
if (empty($id) || !preg_match('/^[a-zA-Z0-9]+$/', $id)) {
    http_response_code(400);
    die('Ungültige ID');
}

// Ziel-URL konstruieren
// construct target URL
$targetUrl = "https://tailorpdf.com/download/" . $id;

// HTTP-Header für die Weiterleitung der PDF-Datei
// HTTP headers for fetching the PDF file
$ch = curl_init($targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

// Header-Funktion zum Abfangen der Original-Header
// header function to capture original headers
$headers = [];
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) < 2) return $len;
    
    $key = strtolower(trim($header[0]));
    $value = trim($header[1]);
    $headers[$key] = $value;
    
    return $len;
});

// PDF-Inhalt abrufen
// fetch PDF content
$pdfContent = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Fehlerbehandlung
// error handling
if ($httpCode !== 200 || $pdfContent === false) {
    http_response_code(404);
    die('PDF nicht gefunden - falsche ID <br>PDF not found - wrong ID');
}

// Dateinamen aus Content-Disposition Header extrahieren
// extract filename from Content-Disposition header
$filename = 'document.pdf'; // Fallback

if (isset($headers['content-disposition'])) {
    // Beispiel: attachment; filename="document_customer_123456.pdf"
    // oder: inline; filename="document_customer_123456.pdf"
    // Example: attachment; filename="document_customer_123456.pdf"
    // or: inline; filename="document_customer_123456.pdf"
    if (preg_match('/filename=["\']?([^"\';\r\n]+)["\']?/i', $headers['content-disposition'], $matches)) {
        $filename = $matches[1];
    }
}

// Header für PDF-Download setzen
// set headers for PDF download
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Length: ' . strlen($pdfContent));
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');

// PDF ausgeben
// output PDF
echo $pdfContent;