Hallo,
Also Dein Slash-Problem löst sich eigentlich, wie schon in #8 angedeutet.
Da es scheinbar Verständnisprobleme gibt, hier nochmal im Detail ( sorry, falls der Beitrag etwas länger wird ):
Ich gehe mal nach den Beiträgen zu urteilen davon aus, dass Du einen Apache Webserver als Basis hast, denn sonst sind .htaccess Dateien i.d.R. wirklungslos. Als erstes leitest Du wie gesagt alle Anfragen auf nicht existente Dateien oder Verzeichnisse direkt auf die Datei index.php, wie bereits in #8 beschrieben:
[CODE]RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^ index.php [QSA,L][/CODE]
In der index.php kannst Du nun das ganze analysieren und die entsprechende Seite aufrufen.
Aber wie?
Du kannst über das superglobale Array [FONT=Courier New]$_SERVER[/FONT] auf die [FONT=Courier New]REQUEST_URI[/FONT] zugreifen:
[PHP]$sRequestUri = trim( $_SERVER[‚REQUEST_URI‘], ‚/‘ );[/PHP]
Das [FONT=Courier New]trim()[/FONT] sorgt i.d.R. dafür, dass Steuerzeichen, wie Tabs oder Zeilenumbrüche am Anfang und/oder Ende der Zeichenkette entfernt werden. Mit dem zweiten Parameter [FONT=Courier New]/[/FONT] sage ich ihm allerdings, dass er ebenfalls führende und abschliessende Slashes entfernen soll, womit Dein Slash-Problem eigentlich schon gelöst ist, denn beide dieser Aufrufe:
http://www.example.com/foo
http://www.example.com/foo/
werden auf die Weise als foo
in [FONT=Courier New]$sRequestUri[/FONT] gespeichert, also ohne Slash! Damit sind beide Aufrufe für den Benutzer also auch Google identisch.
Jetzt kenne ich Deine grundlegende Struktur der Seiten nicht, also unterstelle ich Dir zwecks Beispiel mal eine…
Ich gehe für die Weiterführung des Beispiels deshalb davon aus, dass Du einfach statische HTML-Seiten hast. Weiterhin behaupte ich einfach mal, dass diese sich im Ordner [FONT=Courier New]content/[/FONT] befinden.
Du musst jetzt nichts weiter tun, als quasi ein Mapping zu erstellen, welches dafür sorgt, dass die erwartete Seite zu den Seitenaufrufen angezeigt wird. Dafür gibt es jetzt haufenweise Möglichkeiten und sicher auch bessere, wie die folgende, aber ich möchte das Ganze an dieser Stelle einfach halten.
Folgendes Mapping ( Aufruf => Seite ) werfe ich mal als Vorlage in den Raum:
http://www.example.com/startseite => content/startseite.html
http://www.example.com/kontakt => content/kontakt.html
http://www.example.com/impressum => content/impressum.html
Hier ist es relativ einfach, da jeder Aufruf wie die anzuzeigende Seite heißt. Ich muß also nur einmal kurz prüfen, ob die Datei existiert. Um auf Aufrufe reagieren zu können, die keine gültige Seite mappen, gibt es wiederum mehrere Möglichkeiten, ich bestimme für dieses Beispiel mal eine eigene 404 Seite:
[PHP]$sContentFolder = DIR . ‚/content/‘;
$sContentFilePath = $sContentFolder . $sRequestUri . ‚.html‘;
if ( !is_dir($sContentFilePath) ) {
header ( 'HTTP/1.0 404 Not Found' );
$sContentFilePath = $sContentFolder . '404.html';
}[/PHP]
Jetzt habe ich in [FONT=Courier New]$sContentFilePath[/FONT] den Pfad entweder zur angeforderten Datei oder zu Deiner 404-Seite.
Als letztes brauchst Du den Inhalt nur noch ausgeben:
[PHP]echo file_get_contents( $sContentFilePath );[/PHP]
Das ganze ist i.d.R. natürlich etwas umfangreicher, bspw. sollte man den Wert von [FONT=Courier New]$_SERVER[‚REQUEST_URI‘][/FONT] filtern, bevor man den aufs Dateisystem los lässt.
Weiterhin erfordert das ganze auch weitere Logik, falls es um Aufrufe über mehrere Ebenen geht:
http://www.example.com/foo/bar/startseite
Ob das allerdings bei Dir relevant ist, kann ich nicht sagen.
Die komplette .htaccess findest Du ja in diesem Beitrag ganz oben, dazu hier nochmal die gesamte minimalistische index.php, die auf das Beispiel bezogen benötigt wird:
[PHP]$sRequestUri = trim( $_SERVER[‚REQUEST_URI‘], ‚/‘ );
$sContentFolder = DIR . ‚/content/‘;
$sContentFilePath = $sContentFolder . $sRequestUri . ‚.html‘;
if ( !is_dir($sContentFilePath) ) {
header ( 'HTTP/1.0 404 Not Found' );
$sContentFilePath = $sContentFolder . '404.html';
}
echo file_get_contents( $sContentFilePath );[/PHP]
[SIZE=3]!!! Das Beispiel dient hier nur zur Erklärung und weist in Details Unvollständigkeiten auf, auf die bewußt nicht eingegangen wurde !!![/SIZE]
Ich hoffe, das war einigermassen verständlich? Wenn nicht, einfach fragen…
Gruß Arne