Sven Rautenberg: Link auf aktuelle Datei indentifizieren

Beitrag lesen

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