Christian Seiler: Wurzelverzwichnis auslesen

Beitrag lesen

Hallo Andreas,

Mein Projekt liegt in A. In A liegt ein zentrales Script, das in allen Scripten der Unterverzeichnisse eingebunden ist. In dieser Zentrale soll es eine Variable $projekt_wurzel geben, die z.B. so lautet: http://domain/A/. so soll sie auch lauten, wenn diese Datei in irgendeinem Unterverzeichnis eingebunden ist. Dort wird diese Zentrale dann ja so interpretiert, als würde sie DORT liegen. Wenn ich das ganze Projekt jetzt nach B verschiebe, soll in der Variablen automatisch http://domain/B/ stehen. Geht das?

Naja, den Teil mit dem http://host kriegst Du leicht raus:

if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {  
  $https = true;  
  $projekt_wurzel = 'https://';  
} else {  
  $https = false;  
  $projekt_wurzel = 'http://';  
}  
  
if (isset($_SERVER['HTTP_HOST'])) {  
  $projekt_wurzel .= $_SERVER['HTTP_HOST'];  
} else {  
  $projekt_wurzel .= $_SERVER['SERVER_ADDR'];  
  if (isset($_SERVER['SERVER_PORT']) &&  
      ((!$https && $_SERVER['SERVER_PORT'] != '80') ||  
       ($https && $_SERVER['SERVER_PORT'] != '443'))) {  
    $projekt_wurzel .= ':' . $_SERVER['SERVER_PORT'];  
  }  
  $projekt_wurzel;  
}

Das /A/ und das /B/ ist etwas schwieriger. Wenn alle Scripte des Projekts direkt aufgerufen werden, dann dürfte folgendes reichen:

$projekt_wurzel .= dirname($_SERVER['PHP_SELF']);  
if (substr($projekt_wurzel, -1) != '/') $projekt_wurzel .= '/';

Wenn es außerdem noch verschiedene Unterverzeichnisse gibt, dann musst Du irgendwie schauen, woher Du aufgerufen wirst und aus dirname($_SERVER['PHP_SELF']) die Unterverzeichnisse am Ende des Strings, die definitiv zu Deinem Projekt gehören, rausschmeißen. Eine Möglichkeit wäre z.B., dass das PHP-Script vor dem Include der Datei, die den obigen Code enthält ein

define('PROJEKT_SUBLEVEL', 1);  
include_once '...';

macht. Das include nutzt dann die Konstante PROJEKT_SUBLEVEL und fügt dann mittels str_repeat so viele '../' an $projekt_wurzel an. Wenn PROJEKT_SUBLEVEL würdest Du auf 0 setzen wenn das Script direkt im Projektverzeichnis liegt, auf 1 für die erste Unterverzeichnisebene usw.

Alternativ kannst Du natürlich statt dem Anfügen von lauter '../' Teilpfade aus dem String von hinten rausschmeißen - ist allerdings etwas komplizierter.

Viele Grüße,
Christian