Rolf B: Wie richtig include, so das der Pfad immer korrekt ist?

Beitrag lesen

Hallo sonne,

du musst unterscheiden zwischen dem Dateisystem auf deinem Server und der Dateihierarchie, die der Server dem Browser präsentiert.

Die Seite https://www.example.org/index.php befindet sind im Web-Root von https://www.example.org. Dein Ordner layout befindet sich dort ebenfalls. Die Seite https://www.example.org/content/bla.php befindet sich hingegen in einem Unterordner des Web-Root und deshalb funktioniert der Pfad "./layout/..." nicht, weil der Punkt ja sagt, dass der Pfad relativ zum Ordner sein soll, aus dem das Dokument kommt.

Das ist ein grundsätzliches Problem, wenn man Stylesheets aus Includes einbindet. Das Einbinden über einen relativen Pfad führt eigentlich immer ins Chaos. Solange die ganze Webanwendung im Web-Root liegt, ist es aber einfach lösbar: Binde Ressourcen grundsätzlich über eine absolute Pfadangabe ein. Und solange es nur einen Layout-Order gibt, verwendet man einfach immer /layout/styles/main.css.

Schwieriger wird das, wenn die Ressourcen ebenfalls aus unterschiedlichen Quellen stammen und DAS noch mit Include-Komplexen kombiniert wird. Wenn ich also /module-1/block-c/index.html abrufe, darin /common/header.php include und erwarte, dass dieses Include von unterschiedlichen Modulen verwendet werden kann und die lokalen Stylesheets des jeweiligen Moduls einfügt. Das Include braucht dann Intelligenz. Es kann $_SERVER['SCRIPT_NAME'] analysieren, um sich schlau zu machen. Man könnte auch definieren, dass eine index.html eine globale Variable $module_resources festlegen muss, worin der richtige Pfad steht.

Besser ist dann aber ein abstrahiertes System, das URLs wie https://www.example.org/kunde/573 verwendet. Im Apache verwendet man das mod_rewrite, um diese URL auf https://www.example.org/index.php?exec=kunde/show/573 umzuschreiben, und index.php kümmert sich dann darum, dass das richtige Modul geladen wird und darin die passende Funktion abgerufen wird. Das ist auch nicht einfach - überhaupt nicht einfach - aber es ermöglicht die Trennung von Komponenten und das zentrale Erledigen von Aufgaben, die zur Verkabelung des Ganzen nötig sind. Was Felix vorschlägt, läuft in die gleiche Richtung, versteckt aber die index.php nicht.

Rolf

--
sumpsi - posui - obstruxi