Link auf aktuelle Datei indentifizieren
Heizer
- php
0 Julian Hofmann0 Heizer0 Sven Rautenberg0 Heizer
0 Julian Hofmann0 Heizer
0 lulu0 Heizer
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
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
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
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
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
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
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
Huhu Heizer
hilfreich könnte für Dein Problem auch die PHP-Funktion realpath sein
Viele Grüße
lulu
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