PHP.de Wissenssammlung

Pfade in der Webentwicklung

Serverpfade

Anwendung

Serverpfade sind relevant für

  • Dateisystemfunktionen (dir(), is_file(), glob(), …)
  • normale Includes (include, require, …)

Aufbau

Serverpfade bestehen aus Verzeichnisnamen, die durch Slashes voneinander getrennt sind. Die Gültigkeit der Verzeichnisnamen richtet sich dabei nach dem verwendeten Betriebssystem – Windows und Linux erlauben damit abweichende Zeichenmengen für die Namen der Verzeichnisse. Windows benutzt \ als Pfadtrennzeichen, Linux dagegen /. Unter PHP ist das irrelevant. Da \ aber eine Sonderbedeutung in Strings hat (Escapezeichen), empfiehlt sich eine generelle Verwendung von /, auch unter Windows-Serversystemen.

Absolute Serverpfade

Absolute Serverpfade beginnen mit / und beziehen sich stets auf das Wurzelverzeichnis des Mount points (Linux, Unix) bzw. das Laufwerk (Windows), in dessen Subpfad sich das aktuell gestartete PHP-Script befindet.

Beispiel: index.php liegt unter Windows in C:\xampp\htdocs\test. Eine darin referenzierte Pfadangabe /abc/cde bezieht sich dann auf den Systempfad C:\abc\cde.

Alle anderen Pfade werden als relativ interpretiert.

Relative Serverpfade

Relative Serverpfade beginnen mit einer Verzeichnisangabe (., .., ein oder mehrere Verzeichnisse durch / getrennt) oder sind leer (für das aktuelle Verzeichnis). Sie beziehen sich stets auf den kompletten Serverpfad des aktuell gestarteten PHP-Scripts.

Beispiel: index.php liegt unter Linux in /homepages/47/u110815/htdocs eines Mount points. Eine darin referenzierte Pfadangabe ../abc/cde/test.txt bezieht sich dann auf den Systempfad /homepages/47/u110815/abc/cde/test.txt.

Hinweise:

  • Werden mehrere Scripte durch include bzw. require verbunden, ist das erste (also das gestartete) Script relevant.
  • Die obigen Ausführungen nehmen keinen Bezug auf Zugriffsberechtigungen. Pfade wie im zweiten Beispiel lassen sich zwar adressieren, i. A. wird aber bspw. bei Webhostern der Zugriff auf fremde Userverzeichnisse rechtlich eingeschränkt sein.

Webpfade

Webpfade adressieren über einen URL bestimmte Ressourcen (Dateien oder generierte Daten). Die URLs können dabei echte, physische Pfade, aber auch generische Adressen referenzieren (siehe dazu Abschnitt mod_rewrite).

Grundsätzlich ist die Vorstellung, dass zu einem URL http://www.example.org/foo/bar.html irgendwo eine Datei bar.html in einem Verzeichnis foo existieren muss, nicht zutreffend. Bei vielen Frameworks oder Webseiten ist eine Entsprechung zwischen URL und tatsächlichem Speicherort nur bei Ressourcen wie CSS- und JavaScript-Dateien oder Grafiken gegeben, während Requests, die HTML-Code anfordern, von einem einzigen zentralen Skript abgehandelt werden, das den URL in seine Bestandteile zerlegt und anhand dieser die korrekte Ausgabe generiert (manchmal als Front Controller pattern bezeichnet).

Anwendung

Webpfade

  • bilden konkrete Daten oder Dokumente auf Pfade ab, müssen dabei aber nicht zwingend auf eine existierende Datei zeigen
  • dienen clientseitig zur Angabe einzubindender Ressourcen (Dokumente über href, Bilder über src, …)
  • können über sogenannte URL-Wrapper Dateizugriffe auf fremde Server ermöglichen (siehe dazu Abschnitt URL-Wrapper)

Aufbau

Wenn sie physische Dateien referenzieren, unterliegen Webpfade zum einen den Beschränkungen des verwendeten Filesystems (Ausnahme: mod_rewrite und vergleichbare Techniken). Desweiteren ist die Menge der für URLs gültigen Zeichen weiter eingeschränkt. Hier kommen Escapezeichenketten zum Einsatz.

Prinzip

Die Grundlage der URL-Adressierung bildet das DNS System und das Routing über daraus ermittelte IP-Adressen. Grob gesagt, stehen einer oder mehreren IP-Adressen ein physisches Gerät gegenüber. Das DNS wertet dabei den Domain-Teil einer URL aus.

Auf dem jeweiligen Server können anschließend weitere URL-Bestandteile auf konkrete Pfade gemappt werden. In der Regel sind das:

  • die Domain selbst – ein Hoster kann so viele Domains auf einer Maschine vertwalten, indem jeder Domain oder jedem dahinterstehenden Kunden ein konkretes Userverzeichnis bereitsgestellt wird.
  • eine Subdomain – innerhalb des Userverzeichnisses kann ein Unterverzeichnis/ein Subpfad das Rootverzeichnis für die Domain mit Subdomain abbilden.
  • Pfadangaben in der URL werden relativ zum Userverzeichnis adressiert.

Beispiel: Ein Nutzer reserviert sich die Domain http://example.com/ bei seinem Hoster HostingXY. HostingXY richtet dem Nutzer jetzt auf seinem Server das Userverzeichnis /homepages/47/u110815 ein und mappt die Domain http://example.com/ auf /homepages/47/u110815/htdocs. Legt der User nun eine Datei in dieses Verzeichnis (/homepages/47/u110815/htdocs/index.html), so wird der Server den URL http://example.com/index.html entsprechend auflösen und das Dokument ausliefern.

Bezugnehmend auf diese Aussagen, ergeben sich folgende Referenzierungsarten:

Vollständige URL-Angaben

Für diese gilt eben Gesagtes. Domain und Subdomain bestimmen das physische Serververzeichnis, weitere URL-Pfadangaben werden relativ zum Serververzeichnis benutzt, sofern kein Rewriting im Spiel ist.

Beispiel: Bezieht sich die Domain http://example.com/ auf das Verzeichnis /homepages/47/u110815/htdocs, so referenziert die URL http://example.com/images/test.jpg die Datei /homepages/47/u110815/htdocs/images/test.jpg auf der entsprechenden Maschine.

Absolute Webpfade

Die aktuelle Domain (oben http://example.com/) kann durch / angesprochen werden. Es ergibt sich eine absolute Pfadangabe, etwa /images/test.jpg, für eben genanntes Beispiel.

Relative Webpfade

Analog zu absoluten Serverpfaden kann eine Ressource auch relativ zum aktuellen Dokument referenziert werden. Wiederum sind die Angaben ., .., ein Verzeichnispfad oder der leere String gültig. Die Angabe ist dabei relativ zum URL des HTML-Dokuments. Es ist dabei natürlich nicht möglich, den Document-Root zu verlassen, indem ausreichend oft ../ in den Pfad eingefügt wird.

Analogie

Der Serverpfad ist ein Dateisystempfad auf einer konkreten Maschine. Webpfade kann man sich so vorstellen, dass ein Subpfad dieses Dateisystems als eigenes Laufwerk „gemountet“ wird (unter Windows: subst). Damit ergibt sich ein neues Wurzelverzeichnis, das nach „oben hin“ nicht verlassen werden kann und ansonsten normal absolut oder relativ adressiert werden kann.

Hinweise:

  • Sowohl absolute als auch relative Webpfade sind relativ zur aktuellen Domain. „Absolut“ beziehungsweise „relativ“ bezieht sich hier nur auf den Rootpfad der Domain (Document-Root).

  • Wie gesagt, ist das referenzierende Dokument relevant. Gerade bei CSS-Dateien mit url()-Stylesheet-Angaben ist hier der Webpfad der CSS-Datei maßgeblich, nicht der Pfad des (HTML-)Dokuments, das im Browser aufgerufen wurde.

Komplettbeispiel

Struktur des Projekts im Dateisystem:

/
+ homepages
  + 47
    + u110815
      + htdocs
        + includes
            function.php
        + contents
            inhalt.txt
        + images
            title.jpg
            test.jpg
        + css
            styles.css
          index.php

index.php:

<?php

// absoluter Serverpfad als Konstante
define('PATH_PROJECT' , '/homepages/47/u110815/htdocs/');

// relativer Serverpfad
require('includes/function.php');

?><html>
<head>
  <title />
  <!-- absoluter Webpfad -->
  <link rel="stylesheet" href="/css/styles.css">
</head>
<body>

  <div id="logo"></div>
  <?php echo getContent ('inhalt.txt'); ?>

</body>
</html>

function.php:

<?php

function getContent ($file)
{
  // absoluter Serverpfad
  $path= PATH_PROJECT . 'contents/' . $file;

  return(file_get_contents($path));
}

styles.css:

 #logo {
   width :100px;
   height:100px;

   background-image:url(../images/test.jpg); /* relativer Webpfad */
 }

inhalt.txt:

<h1>Dies ist ein Text</h1>
<p>
   <!-- Webpfad mit vollständiger URL -->
   <img src="http://example.com/images/title.jpg" />

   Dies ist ein Text.
</p>

Sichtbarkeit

Als logische Konsequenz aus den obigen Aussagen zum Document-Root ergibt sich, dass jenseits des Document-Roots abgelegte Dateien nicht öffentlich über den Webserver erreichbar sind. Serverseitig (beispielsweise durch PHP) kann dagegen frei auf solche Dateien zugegriffen werden, die entsprechenden Userrechte vorausgesetzt.

„Jenseits des Document-Roots“ bezeichnet alle Pfade, die oberhalb oder parallel zum Document-Root existieren (und selbst nicht als Document-Root gemappt sind).

+ homepages
  + 47
    + u110815
      + htdocs
        + includes
            unsicher
        unsicher
      + more
          + misc
            sicher
          sicher
        sicher

Eine alternative Zugriffssicherung wird in der Praxis durch Einsatz einer .htaccess-Datei erreicht.

Besonderheiten

mod_rewrite

URL-Wrapper

Dieser Beitrag wird zur Zeit diskutiert und wurde zuletzt von mermshaus verändert.

Beiträge die zur Diskussion gestellt werden, enthalten mitunter Informationen bei denen wir uns noch bezüglich der finalen Darstellung absprechen müssen. Gedulde dich etwas, wir stellen diesen Beitrag fertig, sobald die Diskussion beendet ist.

An diesem Beitrag waren bisher beteiligt: nikosch, hausl, mermshaus