Die aktuelle URL ermitteln (Thema: PHP Beispiele)

Beschreibungen der Techniken, zur Ermittlung der aktuellen URL oder von Teilen dieser

1. http oder https?


Wurde die Seite per https aufgerufen, dann ist im $_SERVER-Array der Schlüssel „HTTPS” definiert, sonst nicht. Ob https aktiv ist lässt sich in PHP also wie folgt bestimmen:
PHP-Code
<?php
	$isHttps = (!empty($_SERVER['HTTPS']));
?>

2. Aktuelle Subdomain, Domain und Top-Level-Domain bestimmen


Über den Eintrag „HTTP_HOST” im $_SERVER-Array lassen sich die gegenwärtige Subdomain (www.example.com), Domain (www.example.com) und Top-Level-Domain (TLD, www.example.com) bestimmen.
Der Code lautet wie folgt:
PHP-Code
<?php
	$matches = array();

	if (substr_count($_SERVER['HTTP_HOST'], '.')==1) {
		// domain.tld
		preg_match('/^(?P<d>.+)\.(?P<tld>.+?)$/', $_SERVER['HTTP_HOST'], $matches);
	} else {
		// www.domain.tld, sub1.sub2.domain.tld, ...
		preg_match('/^(?P<sd>.+)\.(?P<d>.+?)\.(?P<tld>.+?)$/', $_SERVER['HTTP_HOST'], $matches);
	}

	$subdomain = (isset($matches['sd'])) ? $matches['sd'] : '';
	$domain = $matches['d'];
	$tld = $matches['tld'];
?>

Das kann man auch in passend benannten Funktionen unterbringen:
PHP-Code
<?php
	function getHostSplitted() {
		$matches = array();
		if (substr_count($_SERVER['HTTP_HOST'], '.')==1) {
			preg_match('/^(?P<d>.+)\.(?P<tld>.+?)$/', $_SERVER['HTTP_HOST'], $matches);
		} else {
			preg_match('/^(?P<sd>.+)\.(?P<d>.+?)\.(?P<tld>.+?)$/', $_SERVER['HTTP_HOST'], $matches);
		}
		return array(0=>(isset($matches['sd'])?$matches['sd']:''), 1=>$matches['d'], 2=>$matches['tld']);
	}

	function getSubdomain() {
		list($subdomain) = getHostSplitted();
		return $subdomain;
	}

	function getHost() {
		list(,$host) = getHostSplitted();
		return $host;
	}

	function getTld() {
		list(,,$tld) = getHostSplitted();
		return $tld;
	}
?>

Anmerkung: Der Wert in $_SERVER['HTTP_HOST'] repräsentiert das, was der Besucher per HTTP-Header an den Server gesendet hat.
Es wird also nicht vom Server generiert, sondern nur empfangen.
Das ist dennoch in der Regel nicht sicherheitskritisch, denn der Server verwendet gewöhnlich diese Information, um herauszufinden, welche
Webseite er ausliefern soll.
Ist die Host-Angabe also nicht gesetzt oder falsch, dann wird der Server auch gar nicht erst PHP aufrufen und wird daher auch nicht diese
falsche Angabe an das Skript weiterleiten.
Das gilt für vermutlich 99,5% aller Webspaces/Shared Hosts und sollte auch für praktisch alle selbst eingerichteten Server gelten.

3. Aktuellen Pfad sowie aktuelle Datei und die Parameter/den Query String ermitteln


Der Pfad lässt sich aus der Variable $_SERVER['REQUEST_URI'] ableiten (darauf achten, dass es REQUEST_URI und nicht REQUEST_URL heißt!).
Diese enthält alles ab der Top-Level-Domain, also Pfad zur Datei, die aufgerufene Datei selbst
und die Parameter (http://www.example.com/dir/dir/file.php?arg1=foo&arg2=bar#abc). Entsprechend können anhand dieser Variable auch die aufgerufene Datei und
die Parameter bestimmt werden, sofern diese definiert wurden.
Am einfachsten lassen sich die Parameter extrahieren:
PHP-Code
<?php
	// Beispiel-URL: http://www.example.com/dir/dir/file.php?arg1=foo&arg2=bar#abc

	// Parameter als String, sogenannter Query String
	$queryString = strstr($_SERVER['REQUEST_URI'], '?'); 	// $queryString enthält jetzt "?arg1=foo&arg2=bar" oder (bool)false falls keine Parameter definiert wurden
	$queryString = ($queryString===false) ? '' : substr($queryString, 1);

	// Parameter als Array
	$parameters = array();
	parse_str(($queryString!==false)?$queryString:'', $parameters); // $parameters enthält jetzt array("arg1" => "foo", "arg2" => "bar")
?>

Anmerkung: Der Query String (bzw. die Parameter) lassen sich mitunter auch aus $_SERVER['QUERY_STRING'] ableiten. Das gilt aber nur solange man nicht
mod_rewrite verwendet und darüber URLs intern umschreibt. Macht man dies, dann enthält $_SERVER['QUERY_STRING'] auch alle Parameter, die von mod_rewrite
gesetzt wurden. Angenommen also jemand ruft die URL http://www.example.com/blog/ auf und es liegt folgender Eintrag in der .htaccess-Datei vor:
RewriteRule ^blog/$ index.php?page=blog [L,QSA]
Dann ist $_SERVER['QUERY_STRING'] nicht leer, sondern enthält stattdessen "page=blog", obwohl dies nicht in der für den Besucher sichtbaren URL steht.
In $_SERVER['REQUEST_URI'] stehen hingegen die Parameter, die tatsächlich vom Besucher übergeben wurden.

Soll nun der aufgerufene Pfad inklusive Datei ermittelt werden, dann kann wie folgt vorgegangen werden, vorausgesetzt der Query String wurde bereits ermittelt:
PHP-Code
<?php
	$path = ($queryString!=='') ? substr($_SERVER['REQUEST_URI'], 0, -strlen($queryString)-1) : $_SERVER['REQUEST_URI'];
?>

Daraus kann wiederum die Datei extrahiert werden, falls eine in der URL enthalten ist (falls nicht ist $file ein leerer String):
PHP-Code
<?php
	// alles ab dem letzten Slash/Schrägstrich (oder (bool)false, falls kein Schrägstrich gefunden wurde)
	$file = strrchr($path, '/');
	// falls kein Schrägstrich gefunden wurde, wird alles als Dateiname angesehen,
	// sonst: falls nach dem letzten Schrägstrich nichts mehr folgte bleibt die Datei leer, sonst alles ab dem letzten Schrägstrich
	$file = ($file===false) ? $path : (($file==='/') ? '' : substr($file, 1));
?>

Und diese Information kann wiederum genutzt werden, um den Pfad ohne Dateinamen zu bestimmen:
PHP-Code
<?php
	$pathNoFile = ($file==='') ? $path : substr($path, 0, -strlen($file));	
?>

4. Hash-Wert bestimmen


Der Hash-Wert (http://www.example.com/dir/dir/file.php?arg1=foo&arg2=bar#abc) lässt sich nicht auslesen, da er einzig als Zeichen für den Browser
des Besuchers gedacht ist, um diesem anzugeben, an welche Stelle auf der Seite er automatisch scrollen soll bzw. zu welchen Anker er springen soll.
Allerdings lässt sich der Wert per JavaScript auslesen und dann an den Server senden.

5. Alles zusammen: Die gesamte aktuelle URL/URI ermitteln


Um nun die gesamte URL zu ermitteln müssen einfach $_SERVER['HTTPS'], $_SERVER['HTTP_HOST'] und $_SERVER['REQUEST_URI'] verknüpft werden:
PHP-Code
<?php
	// Nacheinander
	$url = (empty($_SERVER['HTTPS'])) ? 'http' : 'https';
	$url .= $_SERVER['HTTP_HOST'];
	$url .= $_SERVER['REQUEST_URI']; // $url enthält jetzt die komplette URL

	// Als Einzeiler mit Funktion
	function getCurrentUrl() {
		return ((empty($_SERVER['HTTPS'])) ? 'http' : 'https') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	}
?>

6. Eine URL mittels parse_url() parsen


Eine praktische Funktion zum Aufsplitten von URLs ist parse_url(), welche eine URL entgegen nimmt und diese in seine Bestandteile zerlegt.
Diese Bestandteile sind Scheme (http/https), Host, Port, User, Pass, Path, Query String, Fragment (alles ab #).
Port, User und Pass bzw. Passwort wird man nur sehr selten verwenden und sind daher eher unwichtig.
Die anderen Bestandteile sind aber diejenigen, die zuvor auf anderem Weg ermittelt wurden (Host-Daten und Pfad werden allerdings jeweils nicht aufgesplittet). Wurde die URL „http://www.example.com/dir/dir/file.php?arg1=foo&arg2=bar#abc” vom Besucher
aufgerufen, dann kann man die Bestandteile nun wie folgt ermitteln (die Funktion getCurrentUrl() lässt sich weiter oben finden):
PHP-Code
<?php
	$url = getCurrentUrl();
	$pieces = parse_url($url);
	$scheme = $pieces['scheme']; // enthält "http"
	$host = $pieces['host']; // enthält "www.example.com"
	$path = $pieces['path']; // enthält "/dir/dir/file.php"
	$query = $pieces['query']; // enthält "arg1=foo&arg2=bar"
	$fragment = $pieces['fragment']; // ist leer, da getCurrentUrl() diesen Wert nicht zurückgibt
?>

Kommentare (4)

Von neu nach alt
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ArnoNuehm (Gast) #
das :// hinter http fehlt noch.
ArnoNuehm (Gast) #
Der Sprung zur ID "test" wird vom Browser ausgeführt. Das Hashtag #test wird nicht an den Server übertragen und kann daher auch nicht auf diesem ausgelesen werden. Man kann es aber mit JavaScript abfragen. Dazu einfach nach "JavaScript Hashtag" suchen.
wichtl (Admin) #
Ich vermisse was:
Da ein Link in der Art index.php#test funktioniert (Sprung zur id test) müsste sich 'test' auslesen lassen. Mit den hier gezeigten Methoden geht das aber wohl nicht?
rentner_09 (Gast) #