kann Alias-Pfade verlinken, aber ohne opendir??!?
Felix Riesterer
- webserver
An alle Apache-Fachmenschen!
Für unser Intranet habe ich einen Apache 2.0.48 aufgemacht, dessen Hauptzweck darin besteht, diverse Dateien zu listen, Infos dazu zu geben und diese Dateien per Download verfügbar zu machen.
Mein Problem ist so: Unter DocumentRoot habe ich ein Verzeichnis mit Unterverzeichnissen, in dem ich fast alle Daten für meine Seite gespeichert habe. Per Alias habe ich einen weiteren Ordner hinzugefügt, auf dessen Dateien ich auch verlinken kann, aber mein Directorylisting funktioniert darin nicht!
Im Klartext: openDir("Aliasverzeichnis") liefert eine Fehlermeldung.
Die Ordnerstruktur muss man sich so vorstellen:
root +
+ Verz1 (Dateien für Download)
+ HTML (enthält die .html und .php-Dateien)
+ Verz3 (Dateien für Download)
ALIAS Verz4
Ein Link des Typs href="../Verz4/index.html" funktioniert, in diesem Beispiel sogar ohne "index.html", also href="../Verz4". Aber openDir versagt, obwohl es bei Verz1 und Verz3 NICHT versagt.
Wie kann ich dieses Problem lösen?
hallo,
lass mal conf sehen ;-)(den relevanten teil), was für ein fehler ist es denn genau? und was steht im apache error_log?
gruss
Moin!
Mein Problem ist so: Unter DocumentRoot habe ich ein Verzeichnis mit Unterverzeichnissen, in dem ich fast alle Daten für meine Seite gespeichert habe. Per Alias habe ich einen weiteren Ordner hinzugefügt, auf dessen Dateien ich auch verlinken kann, aber mein Directorylisting funktioniert darin nicht!
Im Klartext: openDir("Aliasverzeichnis") liefert eine Fehlermeldung.
Logisch.
Du mußt unterscheiden zwischen der eher als virtuell anzusehenden URL-Struktur, und der real existierenden Verzeichnisstruktur auf deiner Festplatte. Beide haben miteinander grundsätzlich nichts zu tun!
Erst durch gewisse Definitionen werden beide Strukturen verknüpft. Das ist in den allermeisten Fällen eine so simple Definition wie "Nimm reales Verzeichnis /var/www/userdomain/ als Hauptverzeichnis für HTTP und übernimm alle Unterstrukturen 1:1". So kennt man es.
Wenn du mit Alias arbeitest, bedeutet das eine Zusatzdefinition: "Nimm das reale Verzeichnis /irgendwo/ganz/woanders und behandle es als URL-Verzeichnis /verz4"
Die Krönung dieser Zuweisungsaktionen bietet mod_rewrite, bei dem man wirklich die komplexesten Dinger anstellen kann, um eine vernünftige URL-Struktur auf ein für die Aufgabe notwendiges komplexes Gebilde aus Skripten und Verzeichnissen abzubilden.
Deine Opendir-Funktion greift nicht auf URL-Verzeichnisse zu, sondern auf die realen Verzeichnisse. Wenn dein Verz4 also real nicht dort existiert, wo es sich eigentlich laut 1:1-Zuweisung der URL-Struktur befinden könnte, dann mußt du diesen Sonderfall in deinem Skript berücksichtigen.
- Sven Rautenberg
Vielen Dank!
Eure Antworten haben mich auf neue Ideen gebracht. Werde mir besonders diese mod_rewrite-Geschichte genauer ansehen.
Der entsprechende Teil meiner conf lautet:
DocumentRoot "F:/Netzwerkwelt/online"
Alias /wasnoch "G:/Docs/"
Alias /manuals "G:/Handbuecher/"
Die Errormessage lautet:
Warning: opendir(../manuals): failed to open dir: Invalid argument in F:\Netzwerkwelt\online\HTML\dirlist.inc.php on line 2
Vielleicht kann ich ja dieses Problem mit mod_rewrite lösen... Werde mich dahinter klemmen.
Viele Grüße aus Tübingen.
Felix Riesterer.
Moin!
Vielen Dank!
Eure Antworten haben mich auf neue Ideen gebracht. Werde mir besonders diese mod_rewrite-Geschichte genauer ansehen.
Der entsprechende Teil meiner conf lautet:
DocumentRoot "F:/Netzwerkwelt/online"
Alias /wasnoch "G:/Docs/"
Alias /manuals "G:/Handbuecher/"
Das erklärt es dann doch alles.
Dein Hauptverzeichnis ist "F:/Netzwerkwelt/online". Wenn jemand http://localhost/index.html" anfordert, wird die Datei "F:/Netzwerkwelt/online/index.html" ausgeliefert.
Aufgrund der Alias-Definitionen wird aber _nicht_ "F:/Netzwerkwelt/online/wasnoch/index.html" ausgeliefert, wenn "http://localhost/wasnoch/index.html" angefordert wird, sondern "G:/Docs/index.html". Entsprechendes gilt für URLs mit "/manuals".
Es gibt hier also einen Bruch zwischen Dateisystem und URL-System, der im Prinzip absolut OK ist und niemanden stört...
Die Errormessage lautet:
Warning: opendir(../manuals): failed to open dir: Invalid argument in F:\Netzwerkwelt\online\HTML\dirlist.inc.php on line 2
...außer du versuchst mit einem Skript auf das Dateisystem so zuzugreifen, wie das URL-System dir vorspiegelt.
In diesem Fall willst du das Verzeichnis "../manuals" öffnen. Das ist eine relative Adressierung, also erst "eine Ebene nach oben, und dann das Verzeichnis "manuals". Ausgehend von dem Ablageort des Skriptes in "F:/Netzwerkwelt/online/HTML/dirlist.inc.php" ergibt sich daraus der Versuch, das Verzeichnis "F:/Netzwerkwelt/online/manuals/" zu öffnen.
Das aber existiert nicht, weil die URLs mit "/manuals" ja auf Laufwerk G liegen.
Du mußt deinem Skript also beibringen, dass es bei gewissen URL-Bestandteilen die Alias-Definitionen berücksichtigen muß, und ganz andere Verzeichnisse zu öffnen hat.
Vielleicht kann ich ja dieses Problem mit mod_rewrite lösen... Werde mich dahinter klemmen.
Nicht wirklich. mod_rewrite setzt URLs in andere URLs um. Das Ergebnis eines solchen Vorgangs ist immer noch irgendeine URL, aber keine Position im Dateisystem. Dies wird erst später umgesetzt, und darauf hast du mit mod_rewrite keinen Einfluß.
Du müßtest im Dateisystem ansetzen. Es wäre beispielsweise unter Linux kein Problem, anstelle der Alias-Direktiven einen symbolischen Link zu setzen. Dadurch würde man auf das Verzeichnis "/Docs" unter dem Namen "/manuals" an der richtigen Stelle im Dateisystem verweisen, und alle Dateioperationen (auch das Öffnen eines Verzeichnisses) würden problemlos funktionieren. Leider hast du Windows, und damit geht das nach meinem Wissensstand nicht wirklich.
Die zweiteinfachste Lösung ist wirklich, in deinem Skript zu prüfen, ob ein Verzeichnis mit der URL "/manuals" oder "/wasnoch" geöffnet werden soll, um dann die richtigen Verzeichnisse auf dem anderen Laufwerk anzusprechen.
Die einfachste Lösung wäre, die Inhalte dieser anderen Verzeichnisse auf Laufwerk F in die passenden Unterverzeichnisse zu verschieben.
- Sven Rautenberg
Danke. Aber tut noch nicht.
Es gibt hier also einen Bruch zwischen Dateisystem und URL- System, der im Prinzip absolut OK ist und niemanden stört...
Genau. Aber...
Das ist eine relative Adressierung, also erst "eine Ebene nach oben, und dann das Verzeichnis "manuals".
Ausgehend von dem Ablageort des Skriptes in "F:/Netzwerkwelt/online/HTML/dirlist.inc.php" ergibt sich daraus der Versuch,
das Verzeichnis "F:/Netzwerkwelt/online/manuals/" zu öffnen.
Das aber existiert nicht, weil die URLs mit "/manuals" ja auf Laufwerk G liegen.
Richtig. Warum funktionieren dann aber Links à la href="../manuals/index.html" ?
Du mußt deinem Skript also beibringen, dass es bei gewissen URL-Bestandteilen die Alias-Definitionen berücksichtigen muß, und ganz andere Verzeichnisse zu öffnen hat.
Aha. Wie? Z.B. könnte ich ja den vollen URI-Pfad angeben: open('http://servername/manuals/') oder doch nicht? Es funzt so jedenfalls nicht. :-(
Die zweiteinfachste Lösung ist wirklich, in deinem Skript zu prüfen, ob ein Verzeichnis mit der URL "/manuals" oder "/wasnoch" geöffnet werden soll, um dann die richtigen Verzeichnisse auf dem anderen Laufwerk anzusprechen.
Geht es unter Windoof wirklich nicht einfacher...?
Die einfachste Lösung wäre, die Inhalte dieser anderen Verzeichnisse auf Laufwerk F
in die passenden Unterverzeichnisse zu verschieben.
Tja, und genau das will ich ja eben nicht. So war es vorher, soll aber nun _nicht_ mehr sein. Hmm. Werde wohl nun ein MegaScript schreiben müssen (schwitz), das dann mein Dateisystem "kennt" und keine Alias-Verzeichnisse in falschen Dateistrukturen sucht.
update: Es tut mit ein wenig Aufwand nun doch.
Ich muss eben zwei Variablen definieren. Eine Variable für das URI-Dateisystem und eine für das PHYSIKALISCHE Dateisystem. Dann klappt es nicht nur mit der Anzeige der DirListings, sondern auch mit der Verlinkung der Dateien und Ordner.
Ist zwar etwas aufwändig, aber immerhin löst es mein Problem.
Danke Sven! Deine Erläuterungen waren sehr klar und einleuchtend und haben mich letztlich zur Lösung geführt. Ich lese dieses Forum öfter und sehe mir auch deine Beiträge öfters an. Du bist für dieses Forum eine echte Hilfe!
Nochmals Danke und alles Gute!
Grüße aus Tübingen.