$_SERVER, __FILE__, parse_url(), pathinfo() und Konsorten

Okay, diese Überschrift klingt jetzt gar nicht so spannend wie jene vom Sex-Verbot in den Doppelbetten des A380, mit der die Qualitätsjournalisten von Welt Online eben hausieren gingen. Für alle, die bei drei Buchstaben auch mal an PHP denken, habe ich als Referenz ein kleines Frage-Antwort-Spiel mit jenen Konstanten, vordefinierten Variablen und Funktionen aufgeschrieben, die Auskunft auf existentielle Fragen aus PHP-Sicht geben: Wie heiße ich (will sagen: Wie nennt sich das gerade ausgeführte Skript), wo bin ich (Welcher Pfad führt zu diesem Skript) und was ist drin für mich (Welche Parameter wurden beim Aufruf übergeben).

Alles, was jetzt folgt, ist auf einem Apache-Webserver mit PHP-Modul unter Debian-Linux getestet. Bei PHP als CGI installiert mag es mal ein anderes Ergebnis geben; unter Windows muss man bei allem, was mit dem Dateisystem zu tun hat, darauf achten, dass die Slashes “andersrum” sind. Zur Nachvollziehbarkeit der Beispiele nehmen wir folgende (nicht unbedingt realitätsnahe, aber für das Nachfolgende durchaus aussagekräftige) Konstellation an:

  • Unsere Homepage sei erreichbar unter http://www.meinheim.de, die Phantasie-IP laute 85.299.77.78
  • Bei Aufruf der Domain soll standardmäßig geöffnet werden: http://www.meinheim.de/index.php
  • Die Indexdatei erwartet optional einen Parameter page: http://www.meinheim.de/index.php?page=2
  • und startet eine Session, deren Zufallsnamen PHP in der Session-Variablen “sid” automatisch weiterreicht (enable-trans-sid ist konfiguriert)
  • Da wäre dann noch eine Datei http://www.meinheim.de/include.php, die von index.php inkludiert wird
  • Und es gibt auch ein Unterverzeichnis, in dem wieder eine Index-Datei liegt: http://www.meinheim.de/sub/index.php
  • Der Apache-Server serviert die Webseiten aus: /var/www/
  • Der Pfad im Dateisystem zur Website lautet: /var/www/meinheim.de/

Und schon geht’s los. Sie fragen – PHP antwortet:

Wie lautet der Name des aktuellen Skriptes?

echo $_SERVER['PHP_SELF']
# Ausgabe für http://www.meinheim.de/ : /index.php
# Ausgabe für http://www.meinheim.de/index.php : /index.php
# Ausgabe für http://www.meinheim.de/include.php : /index.php
# Ausgabe für http://www.meinheim.de/index.php?page=2 : /index.php
# Ausgabe für http://www.meinheim.de/sub/index.php : /sub/index.php

Wie lautet die aktuelle URI?

echo $_SERVER['REQUEST_URI']
# Ausgabe für http://www.meinheim.de/ : /
# Ausgabe für http://www.meinheim.de/index.php : /index.php
# Ausgabe für http://www.meinheim.de/include.php : /index.php
# Ausgabe für http://www.meinheim.de/index.php?page=2 : /index.php?page=2
# Ausgabe für http://www.meinheim.de/sub/index.php : /sub/index.php

Welche Parameter wurden an das Skript (per GET, per POST, alle Requests) übergeben?

echo print_r($_GET)
# Ausgabe für http://www.meinheim.de/index.php?page=2 : Array ( [page] => 2 )
# Ausgabe für alle anderen: Array ( )

echo print_r($_POST)
# Ausgabe für alle Varianten: Array ( )

echo print_r($_REQUEST)
# Ausgabe für http://www.meinheim.de/index.php?page=2 : Array ( [page] => 2 [sid] => 47e2f826f49d1280a3c404bee289baf1 )
# Ausgabe für alle anderen: Array ( [sid] => 47e2f826f49d1280a3c404bee289baf1 )

Wie lautet der Hostname?

echo $_SERVER['HTTP_HOST']
# Ausgabe für alle Varianten: www.meinheim.de

Umgekehrt: Wie kann ich eine gegebene URL in ihre Bestandteile zerlegen?

echo parse_url('http://www.meinheim.de/')
# Ausgabe: Array ( [scheme] => http [host] => www.meinheim.de [path] => / )

echo parse_url('http://www.meinheim.de/sub/index.php?page=2')
# Ausgabe: Array ( [scheme] => http [host] => www.meinheim.de [path] => /sub/index.php [query] => page=2 )

Wie lautet die IP-Adresse?

echo $_SERVER['SERVER_ADDR']
# Ausgabe für alle Varianten: 85.299.77.78

Wie lautet der Pfad zum Wurzelverzeichnis für Webseiten im Dateisystem?

echo $_SERVER['DOCUMENT_ROOT']
# Ausgabe für alle Varianten: /var/www/meinheim.de

Wie lautet der Pfad zum aufgerufenen bzw. zum inkludierten Script im Dateisystem?

echo $_SERVER['SCRIPT_FILENAME']
# Ausgabe für http://www.meinheim.de/ : /var/www/meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/index.php : /var/www/
meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/include.php : /var/www/meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/index.php?page=2 : /var/www/meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/sub/index.php : /var/www/
meinheim.de/sub/index.php

echo __FILE__
# Ausgabe für http://www.meinheim.de/ : /var/www/meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/index.php : /var/www/
meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/include.php : /var/www/meinheim.de/include.php
# Ausgabe für http://www.meinheim.de/index.php?page=2 : /var/www/meinheim.de/index.php
# Ausgabe für http://www.meinheim.de/sub/index.php : /var/www/
meinheim.de/sub/index.php

Andersrum: Ich habe einen Pfad, wie kann ich einzelne Namens-Bestandteile daraus extrahieren?

echo basename('/var/www/meinheim.de/sub/index.php')
# Ausgabe: index.php

echo dirname('/var/www/meinheim.de/sub/index.php')
# Ausgabe: /var/www/
meinheim.de/sub

echo pathinfo('/var/www/meinheim.de/sub/index.php')
# Ausgabe: Array ( [dirname] => /var/www/
meinheim.de/sub [basename] => index.php [extension] => php )

echo dirname('/var/www/meinheim.de/sub/index.php')
# Ausgabe: /var/www/
meinheim.de/sub

Zwei Seiten einer Medaille: Mit den vorstehenden, von PHP zur Laufzeit definierten Konstanten, Variablen und den Funktionen lassen sich portable Anwendungen programmieren – URLs und Dateipfade müssen nicht mehr an den jeweiligen Ort angepasst werden. Spätesten jetzt sollte auch klar sein, dass man den Ort, an dem sich ein Skript (oder irgendeine andere Resource) befindet, aus zweierlei Perspektiven referenzieren kann:

  • Als URL: eine über das HTTP-Protokoll aufrufbare Web-Adresse wie http://www.meinheim.de/sub/index.php, die ein Webserver an den anfragenden Browser ausliefert. Dies ist die Perspektive eines Users, der unsere Webseite ansurft.
  • Relativ zum Dateisystem: eine Pfadangabe, die sich auf das Dateisystem des entfernten Rechners bezieht, auf dem die Webseiten liegen. /var/www/meinheim.de/sub/index.php entspricht in unserer Beispiel-Konfiguration der Web-Adresse http://www.meinheim.de/sub/index.php

Klar sollte sein, dass Sie eine Fehlermeldung bekommen, wenn Sie im Browser die Seite /var/www/meinheim.de/sub/index.php aufrufen wollen. Der Browser kann mit einer solchen Pfadangabe nichts anfangen. Er braucht eine URL in der Form http://www.meinheim.de/sub/index.php, um sich die Seite beim Webserver abzuholen.

Wenn Sie selbst testen wollen, welche Ausgaben Ihre Installation aus Sicht von PHP produziert, dann speichern Sie einfach ein PHP-Skript im gewünschten Verzeichnis Ihres Web-Spaces ab, das die gewünschten Ausgaben per echo-Ausgabe produziert. Ich habe ein solches Skript vorbereitet und biete es hier zum Download an:

PHP Pathinfo

Sie sollten allerdings wissen, dass ein solches Skript mehr über Ihren Server verrät, als Ihnen lieb sein kann. Wenn es sich also um einen frei zugänglichen Server handelt, auf den Sie das Skript laden, sollten Sie es mit einem Zugriffsschutz versehen oder zumindest nach Gebrauch gleich wieder löschen.

3 comments on “$_SERVER, __FILE__, parse_url(), pathinfo() und Konsorten”

Schreibe einen Kommentar