Virtuelle Ordner für die eigene Homepage

Mit PHP und der .htaccess Datei können Ordner für eine Homepage simuliert werden. Wir zeigen dir in diesem Artikel, wie das geht.

Klärung des Begriffs

Doch zunächst einmal ist es wichtig zu klären, was mit einem virtuellen Ordner einer Website gemeint ist.

Rufst du beispielsweise www-coding.de/virtuelle-ordner-fuer-die-eigene-homepage/ auf, geht dein Webserver zunächst einmal davon aus, dass er den Ordner virtuelle-ordner-fuer-die-eigene-homepage öffnen und die dort befindliche Index-Datei öffnen soll.

Eine solche Form wirkt schöner und ist leichter zu merken als zum Beispiel www-coding.de/index.php?article=virtuelle-ordner-fuer-die-eigene-homepage oder www-coding.de/index.php?articleID=124. Müsste man allerdings für jede URL einen neuen Ordner einrichten würde es ziemlich unübersichtlich auf dem Server werden.

Um das Problem zu lösen kann man einen Ordner simulieren. Der Nutzer denkt, dass dieser aufgrund der URL existiert, intern wird jedoch eine ganze andere Seite aufgerufen. Wie das funktioniert wird hier erklärt.

Das brauchst du

  • PHP Server bzw. Webspace auf einem PHP Server
  • Möglichkeit eine .htaccess Datei anzulegen
  • Das mod_rewrite Modul

So geht’s – Schritt für Schritt erklärt

  1. .htaccess beschreiben

    Als erstes solltest du die .htaccess anlegen. Öffne dafür einen beliebigen Texteditor und beschreibe die .htaccess mit folgendem Inhalt:

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^(.*)/bilder/(.*)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !^(.*).(gif|png|jpe?g|bmp|php|htm|html|js|css|txt|csv|pdf|xml)$ [NC]
    RewriteRule ^(.*)$ /index.php?url=$1

    In der ersten Zeile wird die benötigte RewriteEngine aktiviert.

    In der zweiten Zeile wird der real existierende Ordner „bilder“ ausgeschlossen. Solltest du beispielsweise ebenfalls einen „echten“ Bilder-Ordner auf deiner Homepage haben, so solltest du „bilder“ durch den Namen deines Ordner ersetzen.

    Die dritte Zeile definiert eine weitere Ausnahme. Es werden verschiedene Dateien ausgeschlossen. Rufen wir eine URL mit Dateiendung auf, die tatsächlich existiert, so wird diese auch angezeigt.

  2. .htaccess hochladen
    Speichere die „.htaccess“ mit einem einfachen Texteditor ohne weitere Endungen wie .txt. Nun lädst du sie in das Hauptverzeichnis (nicht in einen Unterordner) deines Webspace/Servers hoch.Sollte eine Fehlermeldung mit dem Aufruf 500-Fehler auftreten, dann stimmt etwas mit der von dir erstellten .htaccess nicht.
  3. URL Parameter mit PHP verarbeiten
    Die .htaccess übergibt die kompletten URL-Anhängsel nun in dem GET Parameter „url“ an die index.php deiner Website. Diese musst du nun verarbeiten, dafür eignet sich folgender Code Schnipsel:$url = explode("/", str_replace("", "", $_GET["url"]));

    Der Parameter wird abgefragt und Backslashes („\“) werden entfernt. Nun handelt es bei $url um ein Array, welches die verschiedenen Teile der URL enthält. Rufst du zum Beispiel deine-url.de/xy/01-2013/ gilt $url[0] = „xy“; sowie $url[1] = „01-2013“;.Du kannst diese Daten nun in der PHP Datei verwenden.

    So kannst du zum Beispiel per include eine bereits vorhandene Datei einbinden oder Daten aus der Datenbank abfragen. Die Ausgabe funktioniert wie üblich. Beachte jedoch, dass der interne Pfad nicht gleich der URL-Pfad ist. Dies spielt beispielsweise bei der Verwendung von include eine wichtige Rolle.

  4. Fehlerseiten
    Mit dem Nutzen von virtuellen Ordnern auf deiner eigenen Homepage ergibt sich aber auch eine Problematik: Die .htaccess interessiert sich nicht dafür, ob der virtuelle Ordner tatsächlich existiert oder nicht. Die Zuständigkeit erhält in jedem Fall die PHP Datei.Du solltest also mit PHP, etwa durch einen Abgleich mit der Datenbank prüfen, ob diese Seite existiert und sonst eine serverinterne Fehlerseite aufrufen und einen 404-Headercode senden. Das kann zum Beispiel in PHP so aussehen:

    header('HTTP/1.1 404 Not Found');
    require_once 'error_404.php';
    exit;

    Die Datei error_404.php müsste dann entsprechend eine Fehlermeldung ausgeben.

  5. Fertig!
    Du kannst jetzt die virtuellen Ordner, die relativ einfach mit PHP und der .htaccess realisiert wurden, auf deiner Homepage einsetzen.

8 Gedanken zu „Virtuelle Ordner für die eigene Homepage“

  1. Durch die Implementierung habe ich nun allerdings das Problem, dass die Verweise auf verschiedene andere Dateien nicht mehr funktionieren. Z.B. CSS-Dateien
    Da im HTML-Code, welchen ich per php includiere, die relative Pfade eingetragen sind.
    Beim Abruf wird also nach dem „virtuellen Ordner“ gesucht.
    Wie löse ich das ganze?
    Gibt es eine andere Möglichkeit, als mit absoluten Pfaden zu arbeiten?

    1. Aus diesem Grund würde ich im Regelfall auch mit absoluten Pfaden (z.B. „/ordner1/ordner2/datei.php“) arbeiten. Dass die Pfade sich ändern ist gerade bei virtuellen Ordnern beabsichtigt, sodass ich dir dafür leider keine andere Lösung vorschlagen kann, als die Pfade (ggf. automatisiert per Suchen & Ersetzen) anzupassen.

  2. Vielen Dank für die tolle Anleitung! Funktioniert auf dem Webspace auch 1A, und ich war schon glücklich. Aber trotz aktiviertem Apache2-Modul klappt es leider nicht auf meiner lokalen Installation.

    Doofe Frage: geht das über localhost vielleicht gar nicht?

    1. Hallo Sven,

      mit aktiviertem rewrite-Modul sollte das auch unter XAMPP gehen. Ggf. musst du die RewriteBase anpassen.

      Beste Grüße

      1. Danke Tristan!

        Muss ich mir näher ansehen, aber sieht auf den ersten Blick nicht passend für mich aus, weil ich MySQL und nicht MariaDB nutze.

        Meinen lokalen Webserver habe ich über die Paketverwaltung installiert, da ich Linux nutze. Schaue mir das mit der Base noch einmal an, obwohl ich das auch probiert hatte.

        LG Sven

        1. MariaDB bringt nur geringfügige Änderungen gegenüber MySQL mit sich, sollte aber ohnehin keinen Einfluss auf das rewrite-Modul haben.

          Ansonsten bei der Aktivierung von rewrite noch daran denken, dass „AllowOverride All“ gesetzt sein sollte, dann müsste es aber auch auf dem localhost möglich sein.