Wie erhalte ich die vollständige URL in PHP, ohne verrückt zu werden?
\n\nJeder 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?
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\nWarum ist das einfache Kopieren aus $_SERVER schlecht?
\n\nAnfänger schreiben oft so:
\n\n$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];\n\nAuf 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_HOSTkann von einem Angreifer manipuliert werden (Host-Header-Injection). \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\nDie Referenzfunktion: Die vollständige URL korrekt abrufen
\n\nHier ist eine zuverlässige Funktion, die alle wichtigen Szenarien berücksichtigt:
\n\nfunction 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\nWas 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, dassHTTP_HOSTleer ist. \n - Wir verwenden nicht
$_SERVER['SCRIPT_URI']– es ist nicht überall verfügbar. \n
Leistungsoptimierung: Wenn jede Millisekunde zählt
\n\nWenn Sie diese Funktion auf jeder Seite oder in einer Schleife aufrufen, sollten Sie über die Geschwindigkeit nachdenken. Hier sind einige Techniken:
\n\n1. Ergebnis zwischenspeichern
\nWenn sich die URL innerhalb einer Anfrage nicht ändert (und das tut sie nicht), cachen Sie sie:
\n\nfunction getFullUrlCached(): string {\n static $url = null;\n if ($url === null) {\n $url = getFullUrl(); // unsere obige Funktion verwenden\n }\n return $url;\n}\n\nEine statische Variable behält den Wert nach dem ersten Aufruf – keine wiederholten Berechnungen.
\n\n2. Vermeiden Sie unnötige Operationen
\nVerwenden Sie nicht filt