.htaccess und index.php?seite= Problem

Wipeout

Erfahrenes Mitglied
Hallo Community,

irgendwie sehe ich den Wald vor Lauter Bäumen nicht mehr ;)

Ich habe folgendes PHP Script in meiner Index.php

PHP:
<?php

// configure
$getKey = 'seite';
$defaultPage = 'home';
$errorPage = 'error';

$pageArray = array(
  'home' => './module/news/index.php',
  'Gaestebuch' => './module/gaestebuch/index.php',
  'Eintragen' => './module/gaestebuch/eintragen.php',
  'DBeintrag' => './module/gaestebuch/db.php',
  'News' => './module/news/index.php',
  'benutzer' => './benutzer.php',
  'error' => './module/fehler.html'
);
// decide
$page = isset($_GET[ $getKey ])
  ? $_GET[ $getKey ]  //  requested Page
  : $defaultPage;  //  default Page
$toInclude = array_key_exists($page, $pageArray)
  ? $pageArray[ $page ]
  : $pageArray[ $errorPage ];
// execute
include $toInclude;
?>

und ich habe diese .htaccess Datei

Code:
AddDefaultCharSet utf-8
RewriteEngine on
RewriteRule ^([0-9a-z]*)$ index.php?seite=$1 [L,NC]
ansich will ich nur erreichen das ich Links hinkriege die so aussehen


das sollte doch ansich so funktionieren oder was habe ich falsch gemacht ??
 
Zuletzt bearbeitet von einem Moderator:
Und was ist das Ergebnis? Siehst du was? Kommt ein Fehler? Was sagen die Apache-Logs? Ist mod_rewrite geladen?
 
Moin Saftmeister,

erstmal danke das du dich diesem Problem annimmst ;)

Ich habe den Fehler aber gefunden ;)
Habe vergessen das zwischen gross und kleinschreibung unterschieden wird ;)

Ich muss also www.domain.de/Gaestebuch eingeben anstelle von www.domain.de/gaestebuch ;)


Habe aber gleich das nächste Problem wen ich jetzt z.b. www.domain.de/test/test eingebe wird mir meine Webseite ohne CSS angezeigt ..... kann ich das auch irgendwie abfangen ???
 
Zuletzt bearbeitet:
Das hängt mit dem rewrite zusammen. Du musst eine Condition setzen, die den Ordner für die CSS ausschließt.

Code:
RewriteCond %{REQUEST_URI} !^/(css)
 
Hallo Wipeout,

mod_rewrite verarbeitet alle URLs, die als Anfrage an den Webserver geschickt werden. Wenn du im HTML-Code einen Verweis (z.B. ein CSS-Link oder ein Bild) stehen hast, ist das natürlich auch eine URL.

Versuch doch einfach mal die CSS-Datei im Browser direkt anzusurfen. Dann wirst du sehen, das mod_rewrite nach den gleichen Regeln an die index.php weiterleitet. Deswegen hat merzi86 eine Condition vorgeschlagen, wie dies zu verhindern ist. Diese Condition musst du oberhalb der RewriteRule notieren.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html hat gesagt.:
The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule directive. The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

In der Dokumentation zu mod_rewrite findest du genaue Erklärungen.
 
*grübel grübel* Denk also muss ich praktisch css Datei dann mit http://www.domain.de/css.css aufrufen anstelle von css.css ???
Hab ich das richtig verstanden ???
Absoluter oder relativer URL spielt hier keine Rolle, die Anfrage wird in beiden Fällen vom Webserver auf index.php umgeleitet :)

Der Lösungsvorschlag soll die Umleitung der URLs aller eingebundenen Dateitypen (CSS, JS, Grafiken, u.ä.) ausschließen/verhindern.
 
Zuletzt bearbeitet:
Ok, Grundlagen :)

Was passiert, wenn du http://www.test.de/ im Browser aufrufst?

1. Der Browser führt eine Namensanfrage für www.test.de an den für ihn bekannten Namensserver aus, um statt dem Namen eine IP-Adresse zubekommen. Zu dieser baut er eine Verbindung mittels Socket auf Port 80 auf. Das ist wie bei der Auskunft anzurufen, einen Namen zu nennen und eine Telefonnummer zurück zubekommen und diese dann anzuwählen.

2. Der Browser sendet an den Server, welche Datei er haben will, wenn er keine angibt, wird ihm der Server eine vorher eingestellte liefern (z.B. index.html). Der Server liefert also den Inhalt der Datei aus (wir lassen mal absichtlich den Teil mit dem PHP parsen weg.

3. Der Browser hat jetzt also den Inhalt der index.html und kann den HTML-Markup rendern. Dabei stellt er fest, das im Markup Verweise hinterlegt sind in Form von Anker-Links, Bilder, Links auf Resourcen (z.B. CSS) und dergleichen. Was macht der Browser nun? Er baut wiederum eine Verbindung zum im Verweis genannten Adresse auf (außer der Verweis ist ein Anker-Link <a href...>, der eine Benutzer-Aktion erfordert). Die kann jetzt auf dem gleichen Server (also entweder relativ zur ersten Seite index.html oder absolut bspw. http://www.test.de/css/style.css) oder auch auf einem anderen sein (z.B. ein Bild auf dem Server von Flickr).

4. Wenn es ein relativer Verweis ist, also z.B.

HTML:
<link rel="stylesheet" type="text/css" href="css/style.css" />

baut der Browser wiederum eine Verbindung zum Server (relativ zur Seite index.html => www.test.de/css/style.css) auf und fragt diese Datei an. Er bekommt die Datei (oder auch nicht, wenn sie nicht vorhanden ist). Jetzt kann er auch den Inhalt dieser Datei verarbeiten, z.B. als Stylesheet auf den restlichen HTML-Markup anwenden.

5. Wenn der Verweis absolut ist, also z.B.

HTML:
<img src="https://farm1.staticflickr.com/195/519065677_ce5165683f.jpg" alt="PHP-Foto"/>

wird der Browser eine Verbindung zu einen andern (nämlich den im Verweis genannten) aufbauen und dort nach der Datei fragen.

==========

mod_rewrite setzt jetzt an dem Punkt an, bei dem dein Server die Anfrage der Adresse entgegen nimmt. Dann wird mod_rewrite die Adresse gemäß seiner Bedingungen (RewriteCond) und Regeln (RewriteRule) umbiegen und diese umgebogene Anfrage an den Server zurück geben.

Wenn du mod_rewrite eine Regel nennst (z.B. durch einen regulären Ausdruck), nach der alles, was einen Buchstaben oder eine Zahl hat und nach dem Domain-Namen-Slash kommt, an die index.php geleitet werden soll, wird die Anfrage z.B. für

http://www.test.de/gaestebuch

an index.php?seite=gaestebuch weiter geleitet.

Die Adresse

http://www.test.de/css/style.css

wird dann halt an index.php?seite=css weiter geleitet. Wenn dein PHP-Script für die Seite "css" aber keine Aktion hat, geht die Anfrage ins Leere. Daher kam die "Idee" mit der RewriteCond ins Spiel, bei der mod_rewrite eben keine Veränderungen an der URL durchführen darf, wenn sie auf .css endet oder auf eine Datei im Ordner css zugegriffen werden soll. Dann wird die Anfragen eben nicht an index.php geleitet sondern dem Server überlassen, die Datei in seinem DocumentRoot zu suchen und ggf. an den Browser auszuliefern.


So das war jetzt evtl. sehr viel und vom Niveau weit unter dem, was du erwartet hast, aber so wir die Materie evtl. klarer.
 
Zurück