[PHP] includen, document_root geen optie

Pagina: 1
Acties:

  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

Topicstarter
Ik zit nu met een vrij complex probleempje, waarvoor ik uiteraard de search al heb gebruikt. De daar genoemde $DOCUMENT_ROOT is geen optie, later meer hierover :)

De directory tree van een site is als volgt:

site/index.php
site/shared/header.php
site/shared/functions.php

Nu include ik in index.php allereerst header.php, op de volgende manier:
include "shared/header.php"; [dit staat dus in site/index.php]

Tot zover is er uiteraard niets mis, header.php wordt netjes ge-include. Maar nu heb ik in header.php ook nog wat functies nodig, die ik uit functions.php haal. Omdat header.php en functions.php zich in dezelfde directory bevinden, kan je op een Windows-based systeem volstaan met deze include:
include "functions.php"; [dit staat dus in site/shared/header.php]

Op Linux-based hosts worden includes echter bekeken vanaf het primaire script, dat door de client wordt aangeroepen. De bovenstaande header.php kan, indien deze direct wordt aangeroepen, dus zonder problemen het functie-script includen. Echter, wanneer header.php door index.php wordt ge-include, zoekt PHP naar functions.php in de directory waar index.php zich bevindt, site/, en niet in site/shared/

Daarvoor wordt op het forum de volgende oplossing gegeven:
include($DOCUMENT_ROOT."/site/shared/functies.php");

Dit werkt probleemloos onder Windows. Onder Linux heb ik echter de volgende situatie:
De files bevinden zich in /home/user/, dus /home/user/public_html/site/ en /home/user/public_html/site/shared/

De site kan op 2 manieren worden aangeroepen, namelijk:
http://IP-ADRES/~user/site/
of
http://user.blablabla/site/
Hostname is hierbij een virtuele host, die in httpd.conf gedefinieerd is met een rootdir op /home/user/public_html. Wanneer de site via de hostname wordt aangeroepen, zal de volgende include dus als volgt verlopen:
$DOCUMENT_ROOT."/site/shared/functies.php
/home/user/public_html/site/shared/functies.php

Perfect dus.

Maar nu gaan we het nog even hebben over het accessen van de site met het IP-adres. Wanneer de server op alleen het IP-adres wordt aangeroepen, dan kom je op de normale site, die zich ook op de server bevindt. De root daarvan is /var/www/htdocs . Wanneer je dus naar http://IP-ADRES/~user/site/ gaat, dan ziet de include er als volgt uit:
$DOCUMENT_ROOT."/site/shared/functies.php
/var/www/htdocs/site/shared/functies.php

Tsja, en dat werkt niet. :'(

Aangezien de site volledig server-onafhankelijk moet zijn, is het per server aanpassen van het script absoluut geen optie. Daarom hoop ik, dat er een andere oplossing is. Iemand een idee?

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR


  • Bas Jansen
  • Registratie: Juni 2000
  • Laatst online: 16-06 18:29
Misschien kun je wat met $PATH_TRANSLATED?

  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

Topicstarter
Op zaterdag 09 februari 2002 14:18 schreef Bas Jansen het volgende:
Misschien kun je wat met $PATH_TRANSLATED?
Bedankt!
Ik heb <? phpinfo(); ?> er tig keer op nagezocht, en ik heb constant over die variabele heen gekeken :)

Onderstaande code werkt nu in alle situaties:
PHP:
1
2
3
4
<?
$realpath = strrev(strchr(strrev($PATH_TRANSLATED),"/"));
include $realpath."shares/functions.php";
?>

Edit: Hmm... in bijna alle situaties dan. Apache geeft onder Windows namelijk ook forward slashes in een path, terwijl IIS onder Windows backslashes gebruikt. Dus nog ff checken of 'ie een false-waarde heeft, en evt. hetzelfde proberen met een backslash. En ik zat weer met een woord te prutsen, dat toevallig ook een functie is. Niet erg ofzo, maar wel verwarrend. Zo is het beter:
PHP:
1
2
3
4
5
<?
$echtpad = strrev(strchr(strrev($PATH_TRANSLATED),"/"));
if(!$echtpad) { $echtpad = strrev(strchr(strrev($PATH_TRANSLATED),"\\")); };
include $echtpad."shares/functions.php";
?>

Nog een Edit: dirname() kan natuurlijk ook, zie ik nu :P

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR