index.php - best practise

supersalzi

Erfahrenes Mitglied
Hi,
Ich scheitere gerade an der Grundueberlegung, wie man eine bis zu 1000 Seiten grosse Website mit einer index.php Datei vernuenftig verwalten kann. Mir ist dabei wichtig, dass ich die Templates zu verschiedenen Themen in verschiede Ordner stecken kann.
Ich bin blutiger Anfaenger und habe bis jetzt nur Code gesehen, der das nicht schafft, und selbst viel mir nur ein, zwei Variable in der url zu uebermitteln, was aber den Pfad sehr lang macht.
Und wenn ich schon mal am fragen bin:
Wie schaffe ich es urls wie http://www.hhhhl.de/blumen zu verwerten?
Vielen Dank
Salzi
 
hi.

du könntest das z.b. so lösen:
diese zeile kommt in deine index.php
PHP:
// die variable $c steht für content
// du kannst das .php auch weglassen dann kannst du anderen dateitypen includen
include "$c.php";

und die links zu den seiten sehen dann folgendermaßen aus!
Code:
<a href="?c=blumen/seite">Blumen</a>

allerdings würd ich dir bei einer so umfangreichen seite empfehlen, entweder ein db basierendes cms selber zu schreiben oder ein vernünftiges opensource script zu verwenden! ;-)
 
Variablen können nicht per URL übermittelt werden, nur Parameter. Dein Vorschlag geht zwar schon in eine richtige Richtung, nikwithk, jedoch ist sie ein perfektes Ziel für Cross-Site Scripting und ist daher in der Form nicht zu empfehlen. Eine einfache Sicherheitsabfrage, ob die Datei auf dem Server existiert (vgl. file_exists()) könnte dies schon entschärfen. Auch sollte geprüft werden, dass das verarbeitende Script sich nicht selbst aufruft – das kann zu einer Endlosschleife führen.
Weitere Informationen zur Sicheheit bei PHP findet ihr hier im Forum.

Weiteführend könntest du dir auch das Apache-Modul mod_rewrite zum serverinternen Umschreiben der angefragetn Adressen zunutze machen.
 
Keiner deiner Links funktioniert bei mir. Weder der Tutorials.de interne , noch der Blumenddings Link :/

Ich hab bisher meine Seiten immer so aufgebaut:


in der index.php ist an der stelle wo der Content hinsoll eine datei eingebunden:

Code:
 require_once("contentswitch.php");


da drin ist ein riesen switch / case Block in der Form

PHP:
switch$_GET['page']) {

case 'news' : require_once('ordner1/news.php'); break;
case 'gb' : require_once('ordner2/gaestebuch.php'); break;
case 'board' : require_once('ordner42/forum.php'); break;
// ....
// ...
//...

default : require_once('ordner1/news.php');
}

Die jeweiligen Funktionalitäten sind dann eben in dne jeweiligen Dateien.
Ich weiss nicht, bis zu welcher Grössenordnung das Sinn macht, oder obs eine intelligentere Lösung gibt,, bei mir das allerdings bisher wunderbar :)

Evtl macht es Bei deiner Grösse sinn, fuer gewisse Hauptfunktionen bzw alle ?! einen Extra Ordner zu machen, die Seite darin dann immer index.php zu nennen und per GET nur die ordnernamen zu uebergeben, dann kannst du dir aus uebergebenem Ordnernamen und index.php deinen Pfad zur einzubindenden Datei zusammensetzen. Dann Indem du dann die Ordner ausliest, kannst du dir sparen 1000 Cases in den Switch Block zu tippern.

Gruß
Frank
 
Zuletzt bearbeitet:
Ja, das mit dem Cross-Site Scripting stimmt! Ich habe das auf einer meiner Seiten so gelöst dass ich alle Dateinamen in einer DB gespeichert habe und nur die, die sich in dieser tabelle gefunden werden auch included werden dürfen. Ich arbeite da gerade an einer automatischen lösung, bei der dann das Verzeichnis in dem meine Files liegen ausgelesen wird und die vorhandenen Dateinamen gespeichert werden. Im Moment gebe ich diese immer noch von Hand ein. Allerdings ist das denke ich dass dies immer noch um einiges weniger arbeitsaufwendig ist als der Lösungsvorschlag von BeaTBoxX... ;-)
 
Das mit dem Cross-Site-Scripting laesst sich relativ einfach mit ein paar simplen Checks verhindern, folgenden Code habe ich in meiner index.php, und denke, dass der kein Cross-Site-Scripting zulaesst.
PHP:
$subsite=$_GET["subsite"];
if ($subsite)
 {
  if ((strpos($subsite,"index.php")>-1) || (strpos($subsite,"http:")>-1) || (strpos($subsite,"https:")>-1) || (strpos($subsite,"ftp:")>-1))
   {
    header("Location:index.php");
   }
  else
   {
    include($subsite);
   }
 }
else
 {
  include("welcome.php");
 }
 
nikwithk hat gesagt.:
Ja, das mit dem Cross-Site Scripting stimmt! Ich habe das auf einer meiner Seiten so gelöst dass ich alle Dateinamen in einer DB gespeichert habe und nur die, die sich in dieser tabelle gefunden werden auch included werden dürfen. Ich arbeite da gerade an einer automatischen lösung, bei der dann das Verzeichnis in dem meine Files liegen ausgelesen wird und die vorhandenen Dateinamen gespeichert werden. Im Moment gebe ich diese immer noch von Hand ein. Allerdings ist das denke ich dass dies immer noch um einiges weniger arbeitsaufwendig ist als der Lösungsvorschlag von BeaTBoxX... ;-)

Achso du meinst direkt die php Files auslesen , welche zu includen sind, und daraus dann die Seite basteln? Hm ja sicher ist das Viel weniger aufwand %)


Ich hab ja leider immernoch nix von den Beispielen gesehen %)
 
Hi,
na ich sehe schon, tausend Wege fuehren zum Ziel...

Also ich hatte mir das fogender massen gedacht, ich denke mal, das cross-scripting Problem ist geloest.
Aber zugegeberner massen funktioniert es nicht die start.php aufzurufen, sodass am Anfang immer eine Fehlermeldung kommt.
Ob das die superclevere Variante ist, weis ich ueberhaupt nicht, da ich sowas das erste mal mache.
Mit der Greosse der Website sollte ich vielicht folgende Korektur anmerken: ich hatte im Windows einfach die Dateien in meinem Ordner gezaehlt, aber da gibts schon viele Bilder...

Meine Idee:
Code:
<?php
<?php
 
  include "stuff/header.php"; 

 /* if (!isset(*/$_GET["topic"];//)) 
  //{									
 //   $topic = "content/start.php"; 
//  } else {
 //   $topic = $_GET["topic"];  
 // }
 // hier bin ich mir nicht sicher was ich wirklich brauche 
  
  if (!isset($_GET["page"])) 
  {									
    $page = "content/start.php";  // geht noch nicht...
  } else {
    $page = $_GET["page"];  
  }
   $topic = basename($topic); // "Diese Zeile sorgt dafür, dass Pfadangaben entfernt werden" 

  if(!file_exists("content/$topic/$page"))
  {
    include "stuff/error404.html";
  } else {
    include "content/$topic/$page"; 
  }

include "stuff/footer.php"; 
 ?>

Meine Idee war noch, aus den Variablen $tobip und $page gleich eine Navigationszeile "du bist hier" zu generieren. Oder ziehe ich die Hosen mit der Kneifzange an?

Salzi
 
Zurück