Heizer: Link auf aktuelle Datei indentifizieren

Liebes Forum

Kennt jemand eine Möglichkeit, zu erkennen, ob ein Link auf die gerade angezeigte Datei verweißt, auch wenn die Pfadangaben unterschiedlich sind. Wenn ich also nicht zwei Strings vergleichen kann.
Aus datei.html sollen beide Varianten als Link zu dieser Datei erkannt werden:
www.server.de/verzeichnis/datei.html <=> ../verzeichnis/datei.html

Bin um jeden Tipp dankbar.

Heizer

  1. Hallo Heizer,

    Wenn ich also nicht zwei Strings vergleichen kann.
    www.server.de/verzeichnis/datei.html <=> ../verzeichnis/datei.html

    Wenn ich das Problem rictig verstanden habe, dann gibt's ja nur obige zwei Varianten wie der Link aussehen könnte. Mittels $PHP_SELF und $HTTP_HOST sollte sich beides generieren lassen bzw. vergleichen lassen.

    Grüße aus Würzburg
    Julian

    1. Hallo Heizer,

      Wenn ich also nicht zwei Strings vergleichen kann.
      www.server.de/verzeichnis/datei.html <=> ../verzeichnis/datei.html

      Wenn ich das Problem rictig verstanden habe, dann gibt's ja nur obige zwei Varianten wie der Link aussehen könnte. Mittels $PHP_SELF und $HTTP_HOST sollte sich beides generieren lassen bzw. vergleichen lassen.

      Nicht ganz. Ich kann natürlich aus $HTTP_HOST und $PHP_SELF den absulten URI der momentanen Datei bauen, aber wie kann ich eine relative Pfadangabe (die ich verwenden muß, damit die Seite auf mehreren Server laufen kann) in eine absolute verwandeln? Stell dir zudem vor, daß die Verzeichnistiefe teilweise sehr hoch ist (5 - 10 unterverzeichnisse). Ich hatte gehofft, daß es eine Möglichkeit gibt, durch eine Verzeichnis bzw. Dateifunktion festzustellen, ob es sich wirklich um die gleiche URI handelt.

      Trotzdem Danke

      Grüße aus Würzburg

      und grüße vom schönen Starnberger See

      Julian

      Heizer

      1. Moin!

        Ich kann natürlich aus $HTTP_HOST und $PHP_SELF den absulten URI der momentanen Datei bauen, aber wie kann ich eine relative Pfadangabe (die ich verwenden muß, damit die Seite auf mehreren Server laufen kann) in eine absolute verwandeln? Stell dir zudem vor, daß die Verzeichnistiefe teilweise sehr hoch ist (5 - 10 unterverzeichnisse). Ich hatte gehofft, daß es eine Möglichkeit gibt, durch eine Verzeichnis bzw. Dateifunktion festzustellen, ob es sich wirklich um die gleiche URI handelt.

        Du weißt die URL der derzeit angeforderten Ressource.

        Und du weißt die Adresse des relativen Links.

        Wenn du den Ressourcennamen hinten an der URL abschneidest und den relativen Link dransetzt, kriegst du sowas:

        http://www.example.com/der/alte/pfad/ + ../../neue/pfad/ressource.htm ergibt
        http://www.example.com/der/alte/pfad/../../neue/pfad/ressource.htm

        Jetzt mußt du ein wenig "Webserver" spielen und die "eine Ebene hoch"-Bestandteile der URL herausfiltern. Das ist eine Aufgabe für einen regulären Ausdruck: Suche nach "/", gefolgt von irgendeinem Text ohne "/" oder ".", gefolgt von "/../", ersetze das durch "/".

        Führe obigen Schritt solange aus, wie Elemente gefunden werden.

        Diese Lösung ist nicht wirklich 100% sauber, vor allem weil die Ziel-URL ja noch aus ganz anderen Gründen eine vollkommen andere Datei ansprechen könnte etc, aber ich hatte man sowas gebastelt:

        <?php
        function out_navipoint($text,$link)
          {
            global $HTTP_SERVER_VARS;
        //    $loc=dirname($PHP_SELF)."/".$link;
        //    for ($i=1;$i<=2;$i++)
        //    {
        //      $loc=ereg_replace("/[^./]+/../","/",$loc);
        //    }

        if (dirname($link)==dirname($HTTP_SERVER_VARS["REQUEST_URI"]))
            { ?>
        <div class="menuselected"><a href="<?php echo $link ?>"><?php echo $text ?></a></div>
            <? }
            else
            { ?>
        <div class="menupunkt"><a href="<?php echo $link ?>"><?php echo $text ?></a></div>
            <? }
          }
        ?>

        Letztendlich ist der hier interessante Part deswegen auskommentiert worden, weil ich auf absolute Links umgestellt habe. Irgendwas blödes hatte da hineingespielt. Ach ja, richtig: Die REQUEST_URI und $PHP_SELF waren unterschiedlichen Inhalts, weil PHP nur als CGI-Modul lief, und deshalb war die ganze Sache durchsetzt von irgendwelchen CGI-Umleitungsaufrufen und "php.exe", was keine konsistenten Ergebnisse garantieren wollte. Ein wahrer Krampf.

        - Sven Rautenberg

        1. Moin, moin

          Jetzt mußt du ein wenig "Webserver" spielen und die "eine Ebene hoch"-Bestandteile der URL herausfiltern. Das ist eine Aufgabe für einen regulären Ausdruck: Suche nach "/", gefolgt von irgendeinem Text ohne "/" oder ".", gefolgt von "/../", ersetze das durch "/".

          [...] ich hatte man sowas gebastelt:

          Vielen, vielen dank, klappt wunderbar, für alle die das auch nachvollziehen möchten: Ich mußte noch $PHP_SELF als global definieren und eine Funktionalität für relative Pfade beginnend mit ./ hinzufügen, jetzt scheint alles zu funktionieren.

          Merci

          Heizer

      2. Hallo,

        ok, nochmal zum Verständnis Deines Problems:
        Haben die Server das selbe Hauptverzeichnis, also
        www.server1.de/verzeichnis/datei.html == www.server2.de/verzeichnis/datei.html
         <=> ../verzeichnis/datei.html,
        oder verschiedene, also z.B.
        www.server1.de/verzeichnis/datei.html
        www.server2.de/datei.html

        Du (bzw. PHP) muss ja irgendwo seine Verankerung finden, von der aus Pfade bestimmt werden können. Entweder ist dies die Datei, oder aber Dein DocumentRoot.

        Nebenbei:
        Für ein paar wenige (Sub-)Domains habe ich mal an den Anfang jeder Datei mir in PHP meine position in Verzeichnisbaum mit definiert. D.h. www.server/verzeichnis/datei.php enthielt ein $pfad = ../../ um aufs Hauptverzeichnis verweisen zu können, www.server/datei.php enthielt ein $pfad = ../. Das ganze in eine Abfrage der Domains gepackt kann dann auch verschiedene Hauptverzeichnisse vertragen.

        Grüße aus Würzburg
        Julian

        1. Hallo,

          Das Problem hat Sven gelößt, trotzdem vielen Dank

          Nebenbei:
          Für ein paar wenige (Sub-)Domains habe ich mal an den Anfang jeder Datei mir in PHP meine position in Verzeichnisbaum mit definiert. D.h. www.server/verzeichnis/datei.php enthielt ein $pfad = ../../ um aufs Hauptverzeichnis verweisen zu können, www.server/datei.php enthielt ein $pfad = ../. Das ganze in eine Abfrage der Domains gepackt kann dann auch verschiedene Hauptverzeichnisse vertragen.

          Ja, so mache ich das schon lange, schließlich müssen ja all die Grafiken, CSS und JS datein etc. in jede Datei eingebunden werden, und ich schreib das nicht immer mit der hand, und absolut geht eben auch nicht. Aber ein kleiner Tip: Ich setzte diese $path-Variable nicht mehr auf "../" sondern auf "..". Das hat den vorteil, daß ich im HTML-Code einfach z.b. src='$path/images/bild.gif' schreiben kann, weil / die Variable abschließt. sonst mußte ich immer src='".$path."images... schreiben. Dadurch entstand dann auch der kleine Zusatz, den ich svens funktion hinzufügen mußte, denn im Wurzelverzeichnis steht dann natürlich $path = ".".

          Heizer

  2. Huhu Heizer

    hilfreich könnte für Dein Problem auch die PHP-Funktion realpath sein

    Viele Grüße

    lulu

    1. Huhu Heizer

      Huhu lulu

      hilfreich könnte für Dein Problem auch die PHP-Funktion realpath sein

      Sehr interessante Funktion, aber leider gibt sie den Pfad zum Wurzelverzeichnis des Betriebssystems wieder, nicht zum public_html, d.h. ich müßte wieder für die einzelnen Server individuelle Anpassungen vornehmen.

      Viele Grüße

      Grüße zurück in der Hoffnung, daß überall in Deutschland so schönes Wetter ist wie hier (Problem gelößt, ich geh jetzt baden ;-))

      Heizer

      lulu