DocumentRoot Problem

tigerstyle

tigerstyle

Aktives Mitglied
Thread Starter
Dabei seit
29.11.2004
Beiträge
398
Reaktionspunkte
2
Hi,

wenn ich ein File includen will mit:
include("subfolder/file.inc.php");
Dann klapp das ganz normal.
Wenn ich jetzt aber ein File includieren will, welches in einem übergeordneten Verzeichnis liegt klappt das auf meiner lokalen Testumgebung nicht mehr.

Auf dem Server im Internet ist /kunden mein oberstes Verzeichnis, aber lokal liegt es hier: /User/Tigerstyle/Sites/kunden
DocumentRoot ist auf /User/Tigerstyle/Sites eingestellt.
Wenn ich jetzt aber include("/kunden/subfolder/file.inc.php"); mache, dann sucht er, denk ich mal, wirklich ganz oben in /kunden obwohl es aber in /User/Tigerstyle/Sites/kunden liegt. Kann man irgendwo im Apache oder so einstellen, dass /Sites (s.o) das absolute Rootverz. ist und man nicht höher zugreifen kann?

Ich hoffe mein Problem ist klar, und ihr könnt mit helfen.

Danke schonmal.
 
Alias /foobar "/User/Tigerstyle/Sites/"

in die httpd.conf

Apache neu starten, danach kannst du die Seite über http://localhost/foobar/ aufrufen.
 
öhm. nö. außer du legst direkt auf deiner platte (quasi ganz unten, im root, wenn du doppelt auf deine platte im finder klickst ;-) ) nen ordner mit dem namen "kunden" an.
ansonsten kannst du mit include('./ordner/file'); vom docroot aus adressieren.
 
Alias /foobar "/User/Tigerstyle/Sites/"

in die httpd.conf

Apache neu starten, danach kannst du die Seite über http://localhost/foobar/ aufrufen.
Das klappt leider nicht. Er findet immer noch nichts.
öhm. nö. außer du legst direkt auf deiner platte (quasi ganz unten, im root, wenn du doppelt auf deine platte im finder klickst ;-) ) nen ordner mit dem namen "kunden" an.
ansonsten kannst du mit include('./ordner/file'); vom docroot aus adressieren.
Das will ich eben vermeiden. Das ist dann die letzte Möglichkeit.
Aber ich dachte es gibt vielleicht noch mehr trickts in der httpd.conf oder php.ini?
 
IMHO nicht. absolut adressieren ist eben absolut. da gibt es keinen weg dran vorbei ;-)

öhm. meinst du jetzt das mit dem ordner anlegen oder dem punkt vor dem ersten slash?
 
tigerstyle schrieb:
Das klappt leider nicht. Er findet immer noch nichts.

Dann solltest du in der Logdatei nach dem Fehler suchen.

In der php.ini kannst du auch den include_path erweitern (vorher mit phpinfo() den alten Wert anzeigen lassen).
 
persil schrieb:
IMHO nicht. absolut adressieren ist eben absolut. da gibt es keinen weg dran vorbei ;-)
...
Doch, da gibts nen sehr einfachen Trick. :)
Und zwar ganz ohne verbiegen der http.conf oder der php.ini

man schreibt enweder in jeder Datei oder in eine Datei, die man immer wieder included:
PHP:
$docroot=$_SERVER['DOCUMENT_ROOT'];
$host=$_SERVER['HTTP_HOST']
Nun kann man die Variablen $docroot (für Pfadangaben auf Dateien) und $host (für Pfandangaben in Links) unabhängig von der jeweiligen Umgebung verwenden.
Beispiel:
PHP:
include("$docroot/files/head.txt");
print "<a href=\"$host/subdir1/subdir2/site7.html\">Link</a>";

Ich mach das grundsätzlich so (in Perl funktioniert es ähnlich)
Kann ich mir - ehrlich gesagt - gar nicht mehr anders vorstellen.
 
Zuletzt bearbeitet:
maceis schrieb:
PHP:
$docroot=include($_SERVER['DOCUMENT_ROOT'];
$host=include($_SERVER['HTTP_HOST']

Da ist zweimal ein "include(" zuviel, das müssen wir abziehen, das macht dann in Schilling... ;-)

Kann ich mir - ehrlich gesagt - gar nicht mehr anders vorstellen.

Du könntest in dieser zentralen Datei mit ini_set() den include_path zu ändern, dann mußt du $docroot nicht in die include() Aufrufe einbauen.

Wäre natürlich auch eine Möglichkeit für die Fragestellung hier.
 
Nogger schrieb:
Da ist zweimal ein "include(" zuviel, das müssen wir abziehen, das macht dann in Schilling... ;-)
...
Danke für den Hinweis. Ich sollte nicht nach Mitternacht posten :)
(Hab's oben geändert um niemanden zu verwirren.)
 
warum machst du kein include("kunden/subfolder/file.inc.php");
bzw lässt dir mal von php den pfad ausgeben damit du weißt wo du bist und machst das ganze dann relativ "../" müsste dich immer ein ebene höher bringen.
 
Der Tipp von maceis sollte unbedingt beherzigt werden, nur so ist PHP-Code wirklich portierbar. Zusätzlich kann man per httpd.conf auch für jeden Kunden einen virtuellen Apache-Server mitaufsetzen ( geht mit ein paar Zeilen Code), dann hat unter /sites jeder kunde sein eigenes Document-Root. Trotzdem würd ich immer mit den Apache-Variablen und relativen Angaben dazu arbeiten. Be größeren Projekten wird es dann auch wichtig statt require/include auch require_once und include_once zu verwenden.
 
Dann solltest du in der Logdatei nach dem Fehler suchen.
Wo befindet sich die?
warum machst du kein include("kunden/subfolder/file.inc.php");
bzw lässt dir mal von php den pfad ausgeben damit du weißt wo du bist und machst das ganze dann relativ "../" müsste dich immer ein ebene höher bringen.
Weil die Datei von versch. Dateien in ver schiedenen Verzeichnissen inkludiert wird. Und es dann einfach zustressig ist jedesmal die übergeordneten Verz. zu zählen.
In der php.ini kannst du auch den include_path erweitern (vorher mit phpinfo() den alten Wert anzeigen lassen).
Wenn ich dort den Pfad zu docRoot eingebe erzielt das leider auch nicht die lösung des Problems.

@Maceis:
oder gleich so:
include("$_SERVER['DOCUMENT_ROOT']/files/head.txt");
print "<a href=\"$_SERVER['HTTP_HOST']/subdir1/subdir2/site7.html\">Link</a>";

Aber das Blöde an der sache ist, dass ich das dann so in 1000 Datei abändern müsste, deswegen wäre mir eine kleine Lösung in der httpd.conf oder so am liebsten.

Der Tipp von maceis sollte unbedingt beherzigt werden, nur so ist PHP-Code wirklich portierbar. Zusätzlich kann man per httpd.conf auch für jeden Kunden einen virtuellen Apache-Server mitaufsetzen ( geht mit ein paar Zeilen Code), dann hat unter /sites jeder kunde sein eigenes Document-Root. Trotzdem würd ich immer mit den Apache-Variablen und relativen Angaben dazu arbeiten. Be größeren Projekten wird es dann auch wichtig statt require/include auch require_once und include_once zu verwenden.
Stimmt. Ich versuchs mal.
 
tigerstyle schrieb:
...
@Maceis:
oder gleich so:
include("$_SERVER['DOCUMENT_ROOT']/files/head.txt");
print "<a href=\"$_SERVER['HTTP_HOST']/subdir1/subdir2/site7.html\">Link</a>";
Hat zwei Nachteile:
1. zu viel zu tippen (und böde Zeichen dazu)
2. zu fehleranfällig.
Bei 1000 Dateien sind das 2000 Nachteile ;-)
tigerstyle schrieb:
...
Aber das Blöde an der sache ist, dass ich das dann so in 1000 Datei abändern müsste, deswegen wäre mir eine kleine Lösung in der httpd.conf oder so am liebsten.
Mit einer geeigneten regex machst du die Pfadänderungen mit einem Perl one-liner (Stichwort: easy as pie) und die Variablendeklarationen mit nem kleinen Skript.
 
Zuletzt bearbeitet:
tigerstyle schrieb:
Wo befindet sich die?

In der httpd.conf wird das über den Wert von ErrorLog festgelegt.

Weil die Datei von versch. Dateien in verschiedenen Verzeichnissen inkludiert wird. Und es dann einfach zustressig ist jedesmal die übergeordneten Verz. zu zählen.Wenn ich dort den Pfad zu docRoot eingebe erzielt das leider auch nicht die lösung des Problems.

Für zukünftige Entwicklungen, die selbständig sein sollen, würde ich folgendes machen.

In allen Seiten, die über den Browser aufgerufen werden können, ein masterinclude aufrufen.

include("../includes/master.inc.php");

Ja, Verzeichnisse zählen. Ist aber in jeder Seite nur einmal nötig, nur für diese master Datei.

In der master Datei den Includepfad anpassen

PHP:
$aktueller_pfad = implode(DIRECTORY_SEPARATOR, array_slice(explode(DIRECTORY_SEPARATOR, dirname(__FILE__)), 0, -1));
set_include_path(get_include_path() . PATH_SEPARATOR . $aktueller_pfad);

Alle weiteren Einbindungen dann per

include("classes/user/class_foo.php");
include("helper/bar.php");
usw.

Ergebnis ist, daß die Applikation weiß, wo sie installiert ist.

D.h. du kannst sie verschieben und kopieren wie du lustig bist, und auch in der Verzeichnishierarchie wandern, ohne das man in den Seiten etwas anpassen müßte. Und man muß nichts an irgendeiner Konfiguration ändern.

include("$_SERVER['DOCUMENT_ROOT']/files/head.txt");

Das ist allerding ein Syntaxfehler. Muß heißen

include("{$_SERVER['DOCUMENT_ROOT']}/files/head.txt");

im zweiten Beispiel analog.

Aber das Blöde an der sache ist, dass ich das dann so in 1000 Datei abändern müsste, deswegen wäre mir eine kleine Lösung in der httpd.conf oder so am liebsten.

Wie gesagt, include_path in der php.ini ändern wäre für diesen aktuellen Fall wohl am einfachsten. Apache neustarten nicht vergessen.
 
Zuerst mal vielen Dank für Eure Ausfürungen. In diesem Fred ist jetzt für jeden was dabei, der sich ebenfalls mit solch einem Problem herum schlägt.

Wie gesagt, include_path in der php.ini ändern wäre für diesen aktuellen Fall wohl am einfachsten. Apache neustarten nicht vergessen.
Denke ich auch. Aber irgendwas scheine ich falsch zu machen.

In der httpd.conf steht:
Code:
...
DocumentRoot "/Users/Tigerstyle/Sites"
...
<Directory "/Users/Tigerstyle/Sites">
...

In der php.ini steht:
Code:
...
include_path = "/Users/Tigerstyle/Sites"
...

In file.php steht:
Code:
include_once("/kunden/.../config.php");

Aber ich bekomme beim Aufruf der PHP-Seite trotzdem folgende Warnungen:
Code:
[B]Warning:[/B] main(/kunden/.../config.php) [function.main]: failed to open stream: 
No such file or directory in [B]/Users/Tigerstyle/Sites/kunden/.../file.php[/B] on line 
[B]29[/B]

[B]Warning:[/B] main() [function.include]: Failed opening '/kunden/.../config.php' for 
inclusion (include_path='/Users/Tigerstyle/Sites') in 
[B]/Users/Tigerstyle/Sites/kunden/.../file.php[/B] on line [B]29[/B]
 
tigerstyle schrieb:
Code:
include_once("/kunden/.../config.php");

Das funktioniert nicht, weil absolute Pfadangaben immer Dateisystempfade sind, bei denen PHP include_path nicht berücksichtigt.

Das sollte auch auf dem Produktionssystem nicht funktionieren. Fände ich sonst schon ziemlich komisch (oder sehr gut konfiguriert -> chroot des Apache/PHP Prozesses). Kannst du das mal testen?

Wenn du include_once("kunden/.../config.php"); nimmst, dann benutzt PHP auch den include_path. Dann muß aber auf dem Produktionssystem auch der include_path passend gesetzt werden.

Vielleicht doch meine umfassende Lösung von oben implementieren? Dann hättest du für immer Ruhe, egal was kommt.
 
Nogger schrieb:
Das funktioniert nicht, weil absolute Pfadangaben immer Dateisystempfade sind, bei denen PHP include_path nicht berücksichtigt.
Ich dachte das funktioniert so, dass wenn er /kunden/... nicht findet, dann schaut er zusätzlich in den include-Pfaden nach. Also sucht der nach dem Unterverzeichnis kunden im include-Pfad .../Sites. Aber das macht er in dem Fall nur, wenn der Slash vorne nicht mit angegeben wird :-(

Das sollte auch auf dem Produktionssystem nicht funktionieren. Fände ich sonst schon ziemlich komisch (oder sehr gut konfiguriert -> chroot des Apache/PHP Prozesses). Kannst du das mal testen?
Also auf der live-seite geht das: include("/kunden....");
Äh was soll ich testen mit chroot? Bin leider kein Fachmann auf dem Gebiet.

Wenn du include_once("kunden/.../config.php"); nimmst, dann benutzt PHP auch den include_path. Dann muß aber auf dem Produktionssystem auch der include_path passend gesetzt werden.
Stimmt ist mir gestern auch aufgefallen.

Vielleicht doch meine umfassende Lösung von oben implementieren? Dann hättest du für immer Ruhe, egal was kommt.
Soviel Zeit hab ich leider nicht, weil das wäre wirklich eine sehr umfangreicht umstelle
ung, vielleicht nem ich das nächsten monat in angriff.


Könnte ich das Problem evtl. auch lösen, indem ich eine Docroot-Partition erstelle? So hab ich das auf meinem PC auch gemacht. dort hieß es dann: E:\kunden\...
Wie mach ich das dann am besten mit der Partittion, bis jetzt hab nur eine.
 
Habe das Problem gelöst, und zwar (UNIX sei dank) mit einem symbolischen Link auf oberster Ebene:

ln -s /Users/Tigerstyle/Sites/kunden /kunden

Das wars mehr nicht, man muss nicht mal den Apache neu starten :-D
 
Zurück
Oben Unten