Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Website mit virtuellen Dateien



jwebworks
16-03-2003, 18:39
Hallo, Leute,

ich schreibe schon seit einiger Zeit an einen Framework
mit dem ich Websiten gestalten möchte.

Der Inhalt der Webseiten, sowie die Struktur und Benutzer-
daten kommen aus einer Datenbank.

Jetzt habe ich eine besondere Anforderung. Ich möchte
nicht für jede Seite in der Datenbank eine .html-Datei
im Webspace anlegen müssen. Es sollen ja Benutzer,
eigene Seiten anlegen und Versionen (Beispiel) usw.
davon verwalten können. Dies sollte durchgehend in der
Datenbank selbst geschehen, also über PHP-HTML-
Formulare.

Die Seiten kann man jetzt schon anzeigen über den
Aufruf der index.php-Datei und einen Parameter:

Beispiel: http://www.meinewebsite.de/index.php?pageid=12

Das Framework baut automatisch die Navigation und alles,
was dazugehört aussenrum. Bis hierhin funktioniert alles
absolut wunderprächtig.

Es gibt einen Schönheitsfehler der mich richtig stört und bei
dem ich einen (oder mehr) guten Rat bräuchte.

Die URLs sind nichtssagend und nicht übersichtlich. Mein
Wunsch wäre es, auf die Seiten mit:

http://www.meinewebsite.de/kontakt.html

zuzugreifen und in Wirklichkeit wird die index.php aufgerufen
mit dem Parameter ?pageid=kontakt.html

Dafür habe ich schon zwei Lösungen gefunden, die fast ganz
realisiert sind.

1. Einen neuen Handler für .html-Seiten mit .htaccess registrieren:

Also:


AddType application/x-httpd-parse .htm
Action application/x-httpd-parse "/parser/parser.php?file="


2. oder das Neuschreiben der Adressen mit mod_rewrite auch im
.htaccess-file.

Die Sache hat nur eine Einschränkung: Das ganze funktioniert nur
im aktuellen Verzeichnis. Mein Ziel wäre es im WebSpace nur die
Datei index.php zu haben und alles, was dem WebServer als Parameter
auch in Unterverzeichnissen übergeben wird, wird an den Parser
übermittelt.

Rufe ich die Adresse: http://www.meinserver.de/produkte/spass auf,
dann bekomme ich einen 404-Fehler.

Kann mit da jemand helfen?

Lange Rede kurzer Sinn, meine Frage: Sieht hier jemand eine Möglichkeit
die komplette Struktur einer Website in einer Datenbank virtuell (inkl.
virtueller Verzeichnisse) abzulegen? Tips? Adressen?

Bei google habe ich nichts gefunden. Komisch eigentlich, weil diese Anforderung
doch bestimmt schon öfters gestellt wird.

cu, stop.h

msi
16-03-2003, 21:29
wenn du ein eigenes 404 (php) dokument festlegen kannst, kannst du das über dieses realisieren.

mit $_SERVER['REQUESTED_URI'] (oder so ähnlich) steht die URL, die eigentlich angefordert wurde (also wo der 404 Fehler auftrat). Diese musst du auswerten. Vergiss dabei nicht, dass du die Variablen dir per GET übergeben werden, auch noch aus der URL rausholen musst, da diese beim ErrorDocument nicht eingefügt werden.

Wenn du allerdings Daten per POST übertragen willst, musst du eine gültige Datei angeben, also wirst du dann am index.php?file=.... nicht vorbeikommen.

Wenn du wegen dem Auswerten der GET Sachen in der URL nicht weiterkommst, poste es, ich habe hier irgendwo schon mal sowas gemacht.

Gruß Markus

msi
16-03-2003, 21:30
ach ja du solltest auch ein header('HTTP/1.1 200 OK') am Anfang der Seite einfügen, sonst denken die Browser/Suchmaschinen immer noch das ein 404 Fehler auftrat.

vgl dieser Thread: http://www.mrunix.de/forums/showthread.php?s=&threadid=30688&highlight=header%2A

Markus

jwebworks
17-03-2003, 09:04
@msi:
thx für Deine Lösung. Das Umbiegen der 404-Error-Page
habe ich auch mal in Erwägung gezogen. (Hätte ich evtl.
oben mit reinschreiben sollen.) :-)
Ich bin ein Fan von richtig sauberen Programmen beim
"Mißbrauchen" der Fehler-Seite hätte das den Anschein
eines Workarounds, weil es nicht richtig unter "Linux"
zu realisieren ginge.

Ich habe mich heute Nacht hingesetzt und sehr lange mit
"mod_rewrite" auseinandergesetzt. Mittlerweile habe ich
es damit geschafft.

/~benutzer/webroot/.htaccess:


RewriteEngine on
RewriteBase /~benutzer/webroot/
RewriteRule ^.+[html|/]$ parser.php [NC]


Mit der RewriteRule wird alles, was dem Muster oben
entspricht an die Datei "parser.php" weitergegeben
Anfangs hatte ich noch einen Parameter "?page=$1"
dabei und habe den Dateinamen gematcht "^(.+[html|/])$"
aber, das ist nicht nötig.

Auftretende GET-Parameter und der eigentliche Request-
String stehen in php dann im $_SERVER-Array und ganz korrekt
im $_GET- oder $_REQUEST-Array.



Array
(
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Konqueror/3.1; Linux; de, de_DE@euro)
[REDIRECT_QUERY_STRING] => fun=test
[REDIRECT_STATUS] => 200
[REDIRECT_URL] => /~benutzer/webroot/produkte/test.html
[SCRIPT_FILENAME] => /home/benutzer/public_html/webroot/parser.php
[REQUEST_METHOD] => GET
[QUERY_STRING] => fun=test
[REQUEST_URI] => /~benutzer/webroot/produkte/test.html?fun=test
[SCRIPT_NAME] => /~benutzer/webroot/parser.php
[PATH_TRANSLATED] => /home/benutzer/public_html/webroot/parser.php
[PHP_SELF] => /~benutzer/webroot/parser.php
[argv] => Array
(
[0] => fun=test
)

[argc] => 1
)


Ich habe im obigen Beispiel die Adresse

http://www.meinserver.de/~benutzer/webroot/produkte/test.html?fun=test
aufgerufen.

Das Verzeichnis /~benutzer/webroot/ enthält nur die .htaccess-datei, und
die parser.php. "mod_rewrite" leitet jetzt alle Anfragen an:

html-Dateien und
Verzeichnisse, die auf / enden an die parser.php um.

Beispiele:

http://www.meinserver.de/test.html
http://www.meinserver.de/test.html?fun=test
http://www.meinserver.de/kontakt/test.html
http://www.meinserver.de/produkte/
http://www.meinserver.de/produkte/?fun=test

mit php kann man jetzt ganz leicht herausbekommen,
welche seite aufgerufen wurde, ohne dass diese existiert. ich
kann jetzt benutzern die möglichkeit geben, dass diese
seiten anlegen und ändern ohne, dass ich schreibrechte
auf verzeichnisse freigeben muss und ich kann "offline"-seiten
abspeichern, ohne dass sie über das dateisystem schon erreichbar
wären.

Wenn ich damit jemandem die Arbeit erleichtert habe ;-) bitteschön.

cu, stop.h

msi
17-03-2003, 16:33
sehr informativ, danke!
kommen Daten die so per POST verschickt wurden auch an??

jwebworks
17-03-2003, 16:45
Klar, doch :-)

"mod_rewrite" macht hier eine Apache-interne Weiterleitung.
D.h. es werden nur andere Daten geliefert. Für den Zuschauer
bleibt ja alles gleich.

Post-Variablen werden ja mehr oder weniger im Header mit-
geschickt und bleiben dabei erhalten.

Genial, oder?

cu, stop.h

msi
17-03-2003, 19:05
ja, das ist wirklich genial, muss ich gleich ausprobieren!