Parameter in der Domainzeile ersetzen

  • Themenstarter Themenstarter ByeBye 246039
  • Beginndatum Beginndatum
B

ByeBye 246039

Hallo zusammen,

ich habe eine Webseite mit html und php programmiert. Nun war es bislang immer so, dass ich die Seiten wie folgt verlinkt habe:

Ganz oben in der index.php:
PHP:
<?php
   include("incl/contentselect.php");
   if($_GET["c"] < 1){
      $inhalt = 0;
   }else{
      $inhalt = $_GET["c"];
   }
?>

In der contentselect.php:
PHP:
<?php
   $contents = array();
   $contents[0] = array("menu", "home");
   $contents[1] = array("menu", "wir");
   $contents[2] = array("menu", "kontakt");
   ...
?>

Und in der index.php wird dann immer folgendes an die entsprechende Stelle eingefügt:
PHP:
<? //NAVI Anfang
   if(file_exists("content/".$contents[$inhalt][0].".php")){
      include("content/".$contents[$inhalt][0].".php");
   } //NAVI Ende
?>
PHP:
<? //Inhalt Anfang
   if(file_exists("content/".$contents[$inhalt][1].".php")){
      include("content/".$contents[$inhalt][1].".php");
   } //Inhalt Ende
?>

Nun ergibt sich daraus aber mein Problem, dass in der Domainzeile http://www.domain.de/?c=1 auftaucht.
Da das nicht so toll aussieht und für diverse Auswertungstools und auch für die Suchmaschine nicht so geeignet ist, hätte ich gern folgende Anzeige: http://www.domain.de/kontakt.html oder http://www.domain.de/kontakt.php

Ist das ohne große Probleme jetzt noch möglich? Wenn ja, wie kann ich das realisieren? Oder muss ich alles dafür umstellen?

Grüße,
SuLeu
 
Hi SuLeu,

denke mal mit PHP ist das nicht möglich.
Kennst du mod_rewrite?
Ich glaube das geht in die richtige Richtung.
Gehe mal davon aus dass du Apache benutzt.

Warum eigedlich in diesem Unterforum und nicht bei PHP oder noch besser Hosting & Webbserver?

Gruß
 
Hey,

wie mein Vorredner bereits sagte, musst Du dafuer mod_rewrite benutzten. Das ist bei den meisten Webspace-Anbietern vorinstalliert und kann mittels einer .htaccess-Datei neben der index.php aktiviert werden.

.htaccess
Code:
RewriteEngine On
RewriteRule (.*)\.html index.php?c=$1

Dein Code musst du dann lediglich in der Form erweitern, dass $_GET['c'] nun nicht mehr numerisch, sondern ein String ist. Das heisst konkret, dass Du lediglich dein Array '$contents[0]' mit einem anderem Index versehen musst.

PHP:
<?php 
   $contents = array(); 
   $contents['home'] = array("menu", "home"); 
   $contents['wir'] = array("menu", "wir"); 
   $contents['kontakt'] = array("menu", "kontakt"); 
   ... 
?>

//Edit. Da die Unterarrays in $contents nun als zweites Element den gleichen Wert wir der Index selbst hat, kannst Du auch nun einfach ein quasi Whitelist-Array anlegen, das lediglich die Werte in _GET['c'] verifiziert.

PHP:
$contents = array('home', 'wir', 'kontakt');
Bevor Du dann die controller files laedst, kannst einfach mittels
PHP:
if( !in_array($_GET['c'], $contents) ) die('Invalid page')
den Call verifizieren, so dass ein Angreifer nicht beliebige Files includen kann.
 
Zuletzt bearbeitet:
Vielen Dank @javaDeveloper2011 und @MArc für eure Antwort.

@javaDeveloper: Irgendwie ist mir der Beitrag ausversehen in dieses Forum gerutscht. Das war keine Absicht. Eigentlich wollte ich es in das Unterforum php reinschreiben. Keine Ahnung ob ich es jetzt noch verschieben kann.. Vielleicht könnte das ein Admin machen?

Ich habe die Variante von MArc ausprobiert, leider funktionierte es nicht so recht. Wahrscheinlich hatte ich was falsch verstanden. Oder die Variante mit der htaccess klappt local nicht (sorry, habe mit htaccess noch nicht viel zu tun gehabt). Es erschien immer nur ein Serverfehler. :(
Ich habe dann noch mal die halbe Nacht rumgetüftelt und plötzlich kam mir eine Idee:

Die contentselect.php habe ich ganz rausgeschmissen. Dann habe ich jede Seite als php-Datei angelegt (index.php, wir.php, kontakt.php, ...). In die neuen Dateien habe ich dann mein Grundgerüst (inkl. Header) abgespeichert. Dann habe ich auf den Seiten in das Grundgerüst die eigentliche Unterseite immer nur includet:
PHP:
<?php //Inhalt
    if(file_exists("content/wir.php")){ include("content/wir.php"); }
?>

Damit ich das Menü bei Änderungen nur einmal ändern muss, habe ich es ebenfalls in eine externe PHP-Datei ausgelagert und wird im Grundgerüst ebenfalls includet. Auf allen Unterseiten habe ich dann eine Variable definiert:
PHP:
<?php $inhalt = 0; ?>

Und im Menü die Seiten jeweils so verlinkt:
PHP:
<?php
	$aktiv = " id=\"aktiv\"";
?>

<ul class="menuUL">
  <li <?php if($inhalt==0){ echo $aktiv; } ?>><a href="index.php">Home</a></li>
  <li <?php if($inhalt==1){ echo $aktiv; } ?>><a href="wir.php">Wir &uuml; uns</a></li>
  ...
</ul>

@MArc: Nun ist nur die Frage ob meine Variante sonderlich sicher ist?
...so dass ein Angreifer nicht beliebige Files includen kann.

Grüße, SuLeu
 
Hey,

also bezueglich mod_rewrite ist das vermutlich so, dass Du local das Apache-Modul nicht aktiviert hast. Benutzt du Xampp? Wenn ja, hier entlang: http://www.driefmeier.de/artikel/mod_rewrite-unter-xampp-aktivieren/
Was fuer eine Fehlermeldung erscheint? In der error_log findest Du hinweise, ob ich vielleicht ein Typo in dem Snippet habe oder ob lediglich das Modul nicht aktiviert ist.

Was die Sicherheit deines jetzigen design pattern angeht, kann ich nur sagen, dass die so vermutlich schon gegeben ist. Die Tatsache, dass allerdings '.php' nun an jeder URL haengt, finde ich persoenlich nicht so schick. Ich persoenlich praeferiere URLs, die dynamischen Content werfen, ohne File-Extension. Sprich:
Code:
http://<domain>/wir
http://<domain>/kontakt
http://<domain>/produkte
http://<domain>/produkte/bla1
Das allerdings funktioniert nur mit mod_rewrite. Generell finde ich es vom design pattern her angenehmer, wenn jeder Request durch ein controller file geht, anstatt nun jede URL seine eigene Datei hat.

Gibt es ein Grund, wieso Du kein CMS, das dir diese Arbeit erspart, einsetzt?

Gruesse
 
Zuletzt bearbeitet:
Zurück