Vollständige URL in PHP: So erhalten Sie sie schnell und fehlerfrei

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie erhalte ich die vollständige URL in PHP, ohne verrückt zu werden?

\n\n

Jeder PHP-Entwickler stand schon einmal vor der Aufgabe: „Wie bekomme ich die vollständige URL der aktuellen Seite?“. Man könnte meinen, es sei einfach – $_SERVER['HTTP_HOST'] nehmen, $_SERVER['REQUEST_URI'] hinzufügen – und fertig. Aber die Realität bringt, wie immer, ihre eigenen Korrekturen mit sich. HTTP oder HTTPS? Was ist, wenn der Port nicht standardmäßig ist? Was ist, wenn die Seite hinter einem Proxy liegt? Was ist, wenn Sie sie nicht nur abrufen, sondern dies schnell, ohne Speicherlecks und zukunftssicher tun müssen?

\n\n

Die Frage „Get the full URL in PHP“ auf Stack Overflow hat Tausende von Aufrufen und Dutzende von Antworten erhalten. Das ist kein Zufall: Das Thema scheint einfach, aber die Fallstricke sind zahlreich. Heute werden wir nicht nur „wie man es macht“ besprechen, sondern wie man es richtig, schnell und zuverlässig macht. Los geht's!

\n\n

Warum ist das einfache Kopieren aus $_SERVER schlecht?

\n\n

Anfänger schreiben oft so:

\n\n
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
\n\n

Auf den ersten Blick funktioniert es. Aber schauen wir uns die Probleme an:

\n
    \n
  • Kein HTTPS. Wenn die Seite über HTTPS läuft, erhalten Sie http:// – und der Browser beginnt, sich über gemischte Inhalte zu beschweren.
  • \n
  • Port. Wenn der Port nicht standardmäßig ist (z. B. 8080), geht er verloren, wenn Sie nicht $_SERVER['SERVER_PORT'] verwenden.
  • \n
  • Proxys und Load Balancer. Hinter einem Reverse-Proxy (Nginx, Cloudflare) kann $_SERVER['HTTP_HOST'] anders sein als das, was der Benutzer sieht.
  • \n
  • Sicherheit. Der Wert von HTTP_HOST kann von einem Angreifer manipuliert werden (Host-Header-Injection).
  • \n
\n\n

Kurz gesagt, Copy-Paste aus der ersten Antwort auf Stack Overflow ist nicht die beste Option. Lassen Sie uns eine korrekte und leistungsstarke Funktion schreiben.

\n\n

Die Referenzfunktion: Die vollständige URL korrekt abrufen

\n\n

Hier ist eine zuverlässige Funktion, die alle wichtigen Szenarien berücksichtigt:

\n\n
function getFullUrl(): string {\n    $protocol = 'http';\n    if (\n        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')\n        || (int)$_SERVER['SERVER_PORT'] === 443\n    ) {\n        $protocol = 'https';\n    }\n\n    // Header von Proxys berücksichtigen (falls vertrauenswürdig)\n    $host = $_SERVER['HTTP_HOST'] ?? '';\n    if (empty($host) && !empty($_SERVER['SERVER_NAME'])) {\n        $host = $_SERVER['SERVER_NAME'];\n    }\n\n    // Port-Prüfung\n    $port = (int)$_SERVER['SERVER_PORT'];\n    $portSuffix = '';\n    if (\n        ($protocol === 'http' && $port !== 80)\n        || ($protocol === 'https' && $port !== 443)\n    ) {\n        $portSuffix = ':' . $port;\n    }\n\n    $uri = $_SERVER['REQUEST_URI'] ?? '/';\n\n    return $protocol . '://' . $host . $portSuffix . $uri;\n}
\n\n

Was ist hier wichtig?

\n
    \n
  • Wir prüfen HTTPS – die Standardmethode, funktioniert in 99% der Fälle.
  • \n
  • Wir berücksichtigen SERVER_PORT – wenn die Seite auf einem nicht standardmäßigen Port läuft, verlieren wir ihn nicht.
  • \n
  • Fallback über SERVER_NAME – für den Fall, dass HTTP_HOST leer ist.
  • \n
  • Wir verwenden nicht $_SERVER['SCRIPT_URI'] – es ist nicht überall verfügbar.
  • \n
\n\n

Leistungsoptimierung: Wenn jede Millisekunde zählt

\n\n

Wenn Sie diese Funktion auf jeder Seite oder in einer Schleife aufrufen, sollten Sie über die Geschwindigkeit nachdenken. Hier sind einige Techniken:

\n\n

1. Ergebnis zwischenspeichern

\n

Wenn sich die URL innerhalb einer Anfrage nicht ändert (und das tut sie nicht), cachen Sie sie:

\n\n
function getFullUrlCached(): string {\n    static $url = null;\n    if ($url === null) {\n        $url = getFullUrl(); // unsere obige Funktion verwenden\n    }\n    return $url;\n}
\n\n

Eine statische Variable behält den Wert nach dem ersten Aufruf – keine wiederholten Berechnungen.

\n\n

2. Vermeiden Sie unnötige Operationen

\n

Verwenden Sie nicht filt

Blogs

Buchempfehlungen