Hi brubel:
Die Funktion prüft, ob das Script, das aufgerufen wurde "modules.php" heisst. Wenn Du also dieses include file von "modules.php" aus aufrufst, dann ist alles okay. Wenn nicht, dann 'stirbt' das Script.
Damit hat es folgendes auf sich:
Vermutlich greift Dein modules.php vor dem einschließen der entsprechenden Datei (modules/Statistics/index.php) auf eine Datenbank zu, in der es aus einer Tabelle die Daten des Benutzers ausliest, der dann vermutlich Teil einer Benutzergruppe ist und vergleicht diese Daten mit den Zugriffsrechten der aufgerufenen Seite, die auch in einer Datenbanktabelle verwaltet werden. D.h. nun aber, dass ein unautorisierter Besucher das include file ja direkt aufrufen könnte und somit die Zugriffsrecht-Prüfung umgehen würde. Deshalb wird im include file geprüft, ob das Script, das gerade läuft auch wirklich modules.php ist, die index.php darin also nur eingeschlossen ist, oder ob die index.php direkt aufgerufen wurde (in diesem Fall wäre $PHP_SELF = "index.php" und nicht "modules.php".
Da das aufgerufene Script nun in Deinem Fall aber "statistiken.php" ist, ist $PHP_SELF auch "statistiken.php", jedoch nicht "modules.php" blockt das include file den Zugriff ab.
Abhilfe:
Theoretisch wäre es nun denkbar, die Prüfung von $PHP_SELF auf alle Skripte auszudehnen, die du der Abkürzung halber eingerichtet hast, also:
1:
2:
3:
4:
5: |
if (!eregi("modules.php|statistik.php|home.php", $PHP_SELF)) {
die ("You can't access this file directly...");
}
|
Macht aber nicht wirklich Sinn, da das schlecht zu handeln ist (auch wenn man die Abfrage wiederum zentral auslagern würde).
Jetzt gäbe es die Möglichkeit, in "Statistik.php" einfach eine Umleitung zu machen:
das ist vermutlich für Deine Zwecke gerade die einfachste Lösung.
Eine elegantere Lösungen wäre diese:
Wenn Du es kannst, dann leg Deine include files oberhalb der doc_root ab. Ob Du das kannst, hängt von Deinem Provider ab. Angenommen ein Aufruf von
http://www.domain.tld greift auf ein Serververzeichniss:
httpd/htdocs/domain/www/docs/ zu, dann könntest Du ein Verzeichnis:
httpd/htdocs/domain/www/includes/ anlegen und dort die include files ablegen. Die Daten sind dann via HTTP nicht mehr zu erreichen (sie haben ja keine Adresse/URL) und können von modules.php mit include("../includes/Statistics.php) eingeschlossen werden. Du kannst also getrost den genannten Code aus dem Skript löschen und alles würde funktionieren.
Übrigens:
Das Einrichten eines Skriptes mit dem Namen (in Deinem Beispiel) Statistiken.php macht Sinn, nicht nur, um die URI abzukürzen, sondern auch, um die Indizierung durch Suchmaschinen zu ermöglichen, die ja oft Seiten ignorieren, deren URI's z.B. '.php' oder 'cgi' oder '?...' usw. enthalten.
Dazu werden jedoch nicht wirklich Dateien angelegt, sondern der Server wird dazu aufgerufen, entweder den aufgerufenen Namen umzuschreiben (
www.domain.tld/seite/statistik/02 kann man so z.B. in
http://www.domain.tld/seite.php?name=statistik&seite=2 umschreiben lassen) oder das aufgerufene Script umzuleiten (im obigen Beispiel würden alle Aufrufe, die
http://www.domain.tld/seite/... heissen nach seite.php umgeleitet; dort wird dann der Rest der URI in Variablen geschrieben). Dadurch erleichtert sich die Verwaltung natürlich enorm.
Wenn Du das machen willst, dann finde zunächst heraus, ob auf dem Server PHP als Modul oder als CGI läuft (vermutlich CGI, aus Sicherheitsgründen) und ob in letzterem Fall das Modul mod_rewrite installiert ist.
Ich hoffe, ich konnte Dir helfen, ohne Dich völlig zu verwirren :D
Liebe Grüsse,
Basti
---
...