HOWTO · PHP

Abrufen der aktuellen vollständigen URL in PHP

Dieses Tutorial zeigt, wie man die aktuelle URL in PHP auslesen kann

Auf dieser Seite

Um die URL der aktuellen PHP-Anfrage auszulesen oder zusammenzustellen, kombinieren Sie Schema, Host und URI der Anfrage. Das ist nützlich, wenn Sie eine Seite anhand von Query-Parametern ausgeben oder die angeforderte Adresse protokollieren möchten. Eine zusammengestellte URL ist zunächst nur ein Wert: Vor einer Weiterleitung muss gesondert festgelegt werden, welche Ziele zulässig sind.

Die aktuelle URL aus Anfragedaten zusammensetzen

PHP stellt keinen einzelnen Wert $_SERVER bereit, der immer die vollständige aktuelle URL enthält. Der Server stellt einzelne Informationen zur Anfrage bereit; Ihre Anwendung kombiniert die benötigten Bestandteile. Bei einer typischen Webanfrage lautet das Schema http oder https, der Host kann einen Port enthalten, und die Request-URI umfasst Pfad und Query-String.

Schema, Host und Request-URI aus $_SERVER auslesen

$_SERVER ist ein superglobales Array, das vom Webserver und der Laufzeitumgebung befüllt wird. $_SERVER['HTTP_HOST'] liefert den angefragten Host, während $_SERVER['REQUEST_URI'] üblicherweise Pfad und Query-String enthält. Keiner der beiden Werte ist für sich eine vollständige URL. Der Host stammt aus der eingehenden Anfrage und ist daher als nicht vertrauenswürdige Eingabe zu behandeln: Prüfen Sie ihn anhand bekannter Hosts, bevor Sie ihn in sicherheitsrelevanten Ausgaben verwenden, etwa in einer Weiterleitung oder einem absoluten Link in einer E-Mail.

HTTPS und Anfragen hinter einem Proxy berücksichtigen

Wenn PHP die Anfrage direkt über TLS empfängt, ist $_SERVER['HTTPS'] häufig auf einen nicht leeren Wert wie on gesetzt. Prüfen Sie diesen Wert, bevor Sie das Schema auswählen, und gehen Sie nicht davon aus, dass jeder Server ihn gleich setzt. $_SERVER['REQUEST_SCHEME'] kann ebenfalls verfügbar sein; Verfügbarkeit und Bedeutung hängen jedoch von der Serverkonfiguration ab.

Bei einer Bereitstellung mit Reverse-Proxy kann sich der Browser über HTTPS verbinden, während der Proxy PHP über HTTP erreicht. In diesem Fall kann der direkte HTTPS-Wert nur die Verbindung zwischen Proxy und PHP beschreiben. Ein weitergeleiteter Schema-Header hilft nur, wenn die Anwendung hinter einem ausdrücklich konfigurierten, vertrauenswürdigen Proxy läuft, der vom Client gesendete Kopien entfernt oder ersetzt. Vertrauen Sie keinen weitergeleiteten Headern aus beliebigen Anfragen. Richten Sie dieses Vertrauen auf Proxy- und Anwendungsebene ein oder verwenden Sie das Schema, das der Server zuverlässig bereitstellt.

Pfad und Query-String einschließen

$_SERVER['REQUEST_URI'] enthält häufig einen Wert wie /products.php?category=books&page=2; durch Anhängen bleiben sowohl Pfad als auch Query-String erhalten. Schema und Host sind darin nicht enthalten. Der Query-String kann private oder vertrauliche Werte enthalten. Überlegen Sie daher, ob er in Protokolle, Seitenausgaben oder eine per E-Mail versendete URL gehört. Behandeln Sie eine Request-URI nicht ohne Weiteres als kanonische URL, sondern berücksichtigen Sie auch Routing und Bereitstellung Ihrer Anwendung.

Methode auswählen und das Ergebnis überprüfen

Bei einer normalen Anfrage, die der Webserver direkt verarbeitet, kombinieren Sie die Serverwerte ausdrücklich. Dieses eigenständige Beispiel verwendet repräsentative Anfragewerte, damit der Aufbau klar ist. Es wurde in dieser Schreibphase nicht ausgeführt:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

<?php
$_SERVER = [
    'HTTPS' => 'on',
    'HTTP_HOST' => 'shop.example.test',
    'REQUEST_URI' => '/products.php?category=books&page=2',
];

$isHttps = isset($_SERVER['HTTPS'])
    && $_SERVER['HTTPS'] !== ''
    && strtolower((string) $_SERVER['HTTPS']) !== 'off';
$scheme = $isHttps ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$requestUri = $_SERVER['REQUEST_URI'];
$currentUrl = $scheme . '://' . $host . $requestUri;

echo $currentUrl, PHP_EOL;

Die resultierende Zeichenfolge setzt sich aus Schema, Host und Request-URI zusammen. Verwenden Sie in Ihrer Anwendung die tatsächlichen Anfragewerte und prüfen Sie, wie Ihr Webserver und ein gegebenenfalls verwendeter vertrauenswürdiger Proxy sie befüllen. Validieren Sie den Host, bevor Sie das Ergebnis für eine Weiterleitung verwenden: Das Zusammensetzen der aktuellen URL macht ein beliebiges Weiterleitungsziel nicht sicher.