sonne: Navigation per include Nur mit Absolutpfad möglich?

Hallo zusammen, ich lade meine Navigation per include in meine Seiten. Das funktioniert auch.

<?php include("./includes/nav.php") ?>

die nav.php ist eine simple Liste.

 <ul 
         <li><a href="index.php">Home</a></li>
        <li><a href="tiere/fische/fische.php">Fische</a></li>
        <li><a href="tiere/katzen/katzen.php">Katzen</a></li>
  
       </ul>

Das Problem: Wenn ich z.B. von der Seite Fische die index.php aufrufe passt der Link nicht. Dieser ist dann www.meineDomain/tiere/fische/index.php Es wird also immer das aktuelle Verzeichnis voran gestellt. Ich könnte natürlich alle Links als Absolutpfad angeben. Aber, gibt es keine andere Möglichkeit?

Danke und Grüße

akzeptierte Antworten

  1. Hallo

    ich lade meine Navigation per include in meine Seiten. Das funktioniert auch.

    <?php include("./includes/nav.php") ?>
    

    die nav.php ist eine simple Liste.

     <ul 
             <li><a href="index.php">Home</a></li>
            <li><a href="tiere/fische/fische.php">Fische</a></li>
            <li><a href="tiere/katzen/katzen.php">Katzen</a></li>
      
           </ul>
    

    Das Problem: Wenn ich z.B. von der Seite Fische die index.php aufrufe passt der Link nicht. Dieser ist dann www.meineDomain/tiere/fische/index.php Es wird also immer das aktuelle Verzeichnis voran gestellt. Ich könnte natürlich alle Links als Absolutpfad angeben. Aber, gibt es keine andere Möglichkeit?

    Nein, es gibt keine andere Möglichkeit, wenn du bei einem HTML-Schnipsel bleiben willst. Du könntest die Navigation auch mit PHP-Code, der die Verzeichnisangaben passend zum aktuell geladenen Dokument anreichert, aber die Pfade im reinen HTML-Code einmalig anzugeben, ist wohl die einfachere Lösung.

    Du musst im href-Attribut übrigens den Domainnamen nicht angeben. Der absulute Pfad nach dem Domainnamen (mit führendem Slash) reicht. Das wäre dann einfach:

     <ul>
            <li><a href="/index.php">Home</a></li>
            <li><a href="/tiere/fische/fische.php">Fische</a></li>
            <li><a href="/tiere/katzen/katzen.php">Katzen</a></li>  
     </ul>
    

    Tschö, Auge

    --
    200 ist das neue 35.
    1. Vielen Dank für deine Antwort. Dann werde ich alle Links als Absolutpfad, so wie du es beschrieben hast, abändern. Ich hatte mich nur gewundert das immer das aktuelle Verzeichnis voran gestellt wurde.

      Grüße

      1. Hallo

        Vielen Dank für deine Antwort. Dann werde ich alle Links als Absolutpfad, so wie du es beschrieben hast, abändern.

        Das ist, abseits von möglichen Szenarien, die Rolf skizziert hat, die einfachste Lösung. Beachte aber bitte auch, was Gunnar geschrieben hat.

        Wenn das inkludierte Stück HTML-Code keinen ausführbaren PHP-Code enthält – und das tut es bei dieser Lösung nicht – dann musst du auch nicht einen Weg benutzen, der eine Codeausführung ermöglicht. Einerseits wird dir eventuell von unberechtigter Stelle untergeschobener PHP-Code mit einer Funktion, die eine Datei als String liest, nicht ausgeführt und andererseits ist das schneller als include, wo nach auszuführendem Code gesucht wird.

        Ich persönlich würde im Gegensatz zu Gunnar aber file_get_contents bevorzugen. Aber das musst du für dich ausprobieren.

        Tschö, Auge

        --
        200 ist das neue 35.
    2. Hallo Auge,

      oh. Es geht nicht nur um die Serverseite, sondern (auch) um die Clientseite.

      Hier ist die grundsätzliche Frage, wieviel Flexibilität man will und wie automatisch das Ganze funktionieren soll.

      Im Normalfall hat man eine Webadresse wie https://www.example.org/tiere/fische/index.html, und wenn die Webseite umzieht, dann ändert sich das möglicherweise in https://zoo.example/tiere/fische/index.html

      D.h. nur der Hostname ist anders, aber der Webauftritt an sich ist im Root des Webs eingehängt. Dieser Fall ist einfach - man muss ihn bei der Seitenerstellung überhaupt nicht berücksichtigen.

      Möchte man aber auch den Betrieb einer Testseite unter einer Adresse wie https://wow.example/test/tiere/wassertiere/fische/index.html unterstützen, wird es schwieriger. Zum einen ist auf einmal ein Basispfad im System, zum anderen wurde eine Ordnerebene eingeschoben.

      Hier sollte man zunächst in der .htaccess Datei mit SetEnv den Rootordner in eine Environmentvariable legen (die man im PHP mit getenv abfragen kann), so dass man weiß, in welchem Unterordner von $_SERVER['DOCUMENT_ROOT'] das logische Hauptverzeichnis der Webseite liegt. Alle Scripte müssen dann natürlich ihre Zugriffe darauf beziehen. Ein nav.php kann sich über getEnv den Basispfad holen und ihn einfach allen Navigationslinks voranstellen.

      Das ist auf jeden Fall einfacher, als wenn man sich im nav.php $_SERVER['SCRIPT_FILENAME'] anschaut und damit herausfinden will, wie relative Links zu konstruieren sind. Es geht, aber es ist mühsam.

      Schwieriger wird es mit Ressourcenzugriffen, die im HTML, in JavaScript oder im CSS stehen. Denn auch die müssen einem solchen Umzug folgen können. Bei HTML kann man das noch mit dem erzeugenden PHP Script in den Griff bekommen. Dagegen sind JavaScript und CSS oftmals statische Ressourcen, die nicht über PHP laufen. Hier muss man sich dringend bemühen, auf absolute Pfadangaben zu verzichten.

      Das Einfügen von Ordnerebenen ist und bleibt aber ein Alptraum und ist nur mit hoher Komplexität automatisiert lösbar.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo

        Hallo Auge,

        oh. Es geht nicht nur um die Serverseite, sondern (auch) um die Clientseite.

        Hier ist die grundsätzliche Frage, wieviel Flexibilität man will und wie automatisch das Ganze funktionieren soll.

        Dass da prinzipiell noch viel mehr geht und zu berücksichtigen ist, ist klar. Deshalb deutete ich ja die Möglichkeit, das dynamisch per PHP zu erledigen, an. Das wollte ich aber überhaupt nicht thematisieren, weil die Fragestellung für mich auf „Wie schreibe ich ein HTML-Include ür die Navi so, dass es von überall aus funktioniert und mir nicht allzuviel Schreibarbeit abnötigt?“ hindeutete.

        Dass man sich selbst zum Beispiel mit einer Testumgebung mit anderer Verzeichnisstruktur grandios ins Knie fi… ähh schießen kann, sei dahingestellt. Dann sollte man sich aber per se von vornherein Gedanken darüber machen, ob man nicht, wie von dir beschrieben, nur eine andere Domain mit gleicher Verzeichnisstruktur benutzen sollte oder ob man eine andere Struktur benutzen will oder muss und sich damit die Arbeit machen müssen will, die Navigation doch zu dynamisieren. Das schien mir aber nicht die Aufgabenstellung zu sein.

        Schwieriger wird es mit Ressourcenzugriffen, die im HTML, in JavaScript oder im CSS stehen. Denn auch die müssen einem solchen Umzug folgen können. Bei HTML kann man das noch mit dem erzeugenden PHP Script in den Griff bekommen. Dagegen sind JavaScript und CSS oftmals statische Ressourcen, die nicht über PHP laufen. Hier muss man sich dringend bemühen, auf absolute Pfadangaben zu verzichten.

        Oder man muss einen solchen hypothetischen Fall von vornherein vermeiden oder ihn bei Definitionen für beziehungsweise Zugriffen auf Elemente per CSS und JS bedenken. Es ist ja nicht so, dass man beispielsweise CSS-Selektoren nicht auch mit Teilübereinstimmungen „füttern“ könnte.

        Ein Umzug auf beziehungsweise eine Testumgebung mit identischer Struktur ist aber immer noch die einfachste Lösung dieses Problems.

        Das Einfügen von Ordnerebenen ist und bleibt aber ein Alptraum und ist nur mit hoher Komplexität automatisiert lösbar.

        Aber sowas von.

        Tschö, Auge

        --
        200 ist das neue 35.
  2. Hallo sonne,

    wie wär's mit dem include_path?

    Den kannst Du in der php.ini konfigurieren und dort deinen Includes-Ordner hinzufügen.

    Oder Du tust das zu Script-Beginn, basierend auf $_SERVER['DOCUMENT_ROOT']. Wenn die URL deiner Webseite https://www.example.org/tiere/fische/index.php ist, dann steht in $_SERVER['DOCUMENT_ROOT'] der Name des Ordners, auf den https://www.example.org verweist.

    Wenn Dein Includes-Ordner im Root-Ordner deines Web liegt, dann könntest Du den so in den include_path bringen:

    $myIncludes = $_SERVER['DOCUMENT_ROOT'] . "/includes/";
    set_include_path(get_include_path() . PATH_SEPARATOR . $myIncludes);
    
    include ("nav.php");
    include ("magic1.php");
    include ("dings.php");
    include ("bums.php");
    include ("tralala.php");
    

    Ob Du deine eigenen Includes an den Anfang oder an das Ende des Include-Pfads setzt, ist Dir überlassen. Guck Dir zuerst mal mit einem Testscript an, ob im include_path ab Werk schon was drin steht. Wenn nicht, kannst Du Dir die Arbeit mit get_include_path sparen.

    Wenn schon was drin steht, dann guck, was das ist und guck auch, ob deine eigenen Include-Files namentlich mit denen, die schon im include_path stehen, kollidieren könnten.

    Rolf

    --
    sumpsi - posui - obstruxi
  3. @@sonne

    <?php include("./includes/nav.php") ?>
    

    die nav.php ist eine simple Liste.

    Dann tut es auch readfile()

    include() brauchst du nur, wenn das Include auch nach PHP geparst werden muss, bspw. um die aktuelle Seite im Menü nicht zu verlinken, mit entsprechendem aria-current="page" zu versehen und visuell hervorzuheben. Siehe dieses Menü (Script).

    🖖 Живіть довго і процвітайте

    --
    When the power of love overcomes the love of power the world will know peace.
    — Jimi Hendrix
    1. Vielen Dank für die zahlreichen konstruktiven Vorschläge. Die Hinweise von Rolf haben ihre Berechtigung. Für mich als Anfänger ist es aber noch zu komplex. Da kann ich mich in der dunklen Jahreszeit einmal einlesen. @Gunar du hast Recht, readfile() würde reichen. Danke für den Link zum Script. Auch das muss ich mir die Tage in ruhe ansehen.

      Ich werde es erst einmal so wie Auge es beschreiben hat umsetzen.

      Für Euch zur Info, die HP ist ein privates Hobby Projekt. Ich hatte vor Jahren meine HP mit Joomla erstellt. War es dann aber irgendwann leid das ständig Updates einzuspielen bzw. permanent im Code Änderungen, Optimierungen vorzunehmen. Nach ca. 5 Jahren Pause habe ich mir jetzt wieder dazu entschlossen das Projekt neu aufzusetzen. Diesmal aber klassisch, HTML und eventuell etwas PHP. Ich arbeite mich in die Materie Stück für Stück ein.