Alt 01.08.2006, 15:18:55   #1 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard [PHP, mod_rewrite] Effektiver Frontcontroller mit mod_rewrite

Moin.

Ich bin gerade am tüfteln, wie ich es wohl am besten anstelle. Vielleicht hat ja jemand eine Idee.

Mein Ziel: Ein PHP-Frontcontroller, d.h. alle Anfragen werden an ein PHP-Script (index.php) geleitet. Soweit kein Problem, nur möchte ich mod_rewrite dabei zum Einsatz bringen.
Ein Besucher requestet z.B. www.example.com/Startseite.html, mod_rewrite leitet intern an index.php weiter und dieses PHP-Script erkennt anhand von $_SERVER['REQUEST_URI'], welche Seite gewünscht wird und liefert sie.

Meine Vorteile wären: suchmaschinen-freundliche Seitennamen und einfache Fehlerverarbeitung, weil ich ungültige Seiten (HTTP 404) sofort erkenne und passend darauf reagieren kann.

Im Einsatz habe ich folgende .htaccess:
Code:
1:
2:
RewriteEngine On RewriteRule ^(.*)$ index.php [L]
Diese hat nur das Problem, dass sie wirklich jeden Request an den Frontcontroller schickt, also auch z.B. eine Anfrage nach www.example.com/img/layout.jpeg.

Ich habe im Prinzip 2 Möglichkeiten:
  • Ich lasse den Frontcontroller auch das alles machen. D.h. das Script erkennt, dass das Bild gewünscht wird und schickt es mit passenden Content-type-Header raus. Nachteil is halt, dass ich praktisch die ganze Arbeit des Webservers machen muss Und v.a. kann ich nie mehr eine Datei normal ins Dateisystem setzen, ohne dass mir gleich PHP anspringt, und das möchte ich ungern machen.
  • Ich modifiziere die mod_rewrite-Einstellungen, sodass das /img-Verzeichnis von der Umleitung ausgeschlossen wird. Da bin ich aber noch nicht wirklich weitergekommen, weil ich die passenden Zeilen für die .htaccess-Datei nicht finde
    Außerdem würde ich so den Vorteil verlieren, auch auf Requests für ungültige Verzeichnisse (z.B. www.example.com/das/gibts/nicht/foo.bar) oder Requests für ungültige Dateiangaben im ausgenommenen Verzeichnis (z.B. www.example.com/img/jdklfjlkjkljkljl.xdfg) reagieren zu können.

Was meint ihr ? Welche Taktik bietet sich an ? Und wie müsste ich meine .htaccess umschreiben, um ein oder mehrere Verzeichnisse von der Regelung auszuklammern ?


P.S. Wer nicht weiß, was ein Frontcontroller is, guckt hier mal:
http://www.klamm.de/forum/showthread.php?t=6712
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline   Mit Zitat antworten
Alt 01.08.2006, 15:40:29   #2 (permalink)
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard

Schreib mal Folgendes vor Deine Rule und tüftel damit ein wenig rum:
Code:
1:
2:
3:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l
Damit werden nur nicht existierende URLs auf Deinen FrontController weitergeleitet. Alles, was wirklich existiert, wird auch ausgeliefert.

Genaueres findest Du hier:

http://httpd.apache.org/docs/1.3/mod...ml#RewriteCond
.lange tage und angenehme nächte, tlx
:.whatthemovie.com (Screenshots raten) | PHP ExportForce-Klasse
tleilax ist offline   Mit Zitat antworten
Alt 01.08.2006, 16:40:59   #3 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Zitat:
Zitat von tleilax
Damit werden nur nicht existierende URLs auf Deinen FrontController weitergeleitet. Alles, was wirklich existiert, wird auch ausgeliefert.
Ok danke, der Tip war gut.

Ich hab es jetzt so gelöst:
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
RewriteEngine On # alle Dateien/Verzeichnisse, die nicht existieren # gehen zur Fehlerausgabe an den Frontcontroller RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^.*$ index.php [L] # /include, /pages und /template sind komplett geschützt RewriteRule ^include/.*$ index.php [L] RewriteRule ^pages/.*$ index.php [L] RewriteRule ^template/.*$ index.php [L] # /img-Verzeichnis ist nur vor Einsicht geschützt RewriteRule ^img/$ index.php [L] # alle Requests im Stammverzeichnis gehen auch an den Frontcontroller RewriteRule ^[^/]*$ index.php [L] # alle Dateien in gültigen, sonstigen Verzeichnissen # gehen *nicht* an den Frontcontroller
Es scheint auch so zu funktionieren, wie es die Kommentare sagen
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline Threadstarter   Mit Zitat antworten
Alt 02.08.2006, 23:30:47   #4 (permalink)
Scar
www.Scar4U.de

ID: 81662
Lose senden
Reallife

Reg: 03.06.2006
Beiträge: 427
Standard

*kleiner tip*
wenn du nicht existierende seiten hast (404) und sie dann weiterleitest, solltest du auch per header 404 auf solcher fehlenden seiten hinweisen. suchmachinen mögen das sonst garnet.
Scar ist offline   Mit Zitat antworten
Alt 03.08.2006, 00:09:27   #5 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Zitat:
Zitat von Scar
*kleiner tip*
wenn du nicht existierende seiten hast (404) und sie dann weiterleitest, solltest du auch per header 404 auf solcher fehlenden seiten hinweisen. suchmachinen mögen das sonst garnet.
Jupp, das is klar.
Aber ich kann ja HTTP 404 senden und dem User trotzdem ne anständige Seite vorsetzen
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline Threadstarter   Mit Zitat antworten
Alt 03.08.2006, 19:12:58   #6 (permalink)
MrToiz
Erfahrener Benutzer

ID: 72115
Lose senden

Reg: 28.04.2006
Beiträge: 769
Standard

Zitat:
Zitat von theHacker
Code:
1:
2:
3:
4:
5:
6:
7:
# /include, /pages und /template sind komplett geschützt RewriteRule ^include/.*$ index.php [L] RewriteRule ^pages/.*$ index.php [L] RewriteRule ^template/.*$ index.php [L] # /img-Verzeichnis ist nur vor Einsicht geschützt RewriteRule ^img/$ index.php [L]
Was hälst du von Deny from all bzw. Options -Indexes?
Dann kommt automatisch eine 403er-Meldung (in /img/ nur wenn keine Index-Datei existiert).

Die Fehlermeldungen kannst du ja dann mittels ErrorDocument auf deinen Frontcontroller umleiten.

Finde ich zumindest sinniger^^
 
MrToiz ist offline   Mit Zitat antworten
Alt 04.08.2006, 19:01:42   #7 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Zitat:
Zitat von MrToiz
Die Fehlermeldungen kannst du ja dann mittels ErrorDocument auf deinen Frontcontroller umleiten.
Hab ich mir auch überlegt.

Allerdings würde ich da die Chance aus der Hand geben, am HTTP-Response-Code zu fummeln. Und vielleicht isses ja noch sinnvoll.

Zum Zweiten: Die Arbeit die Fehlerseite zu kreieren etc. hab ich so oder so. Da brauch ich nicht den Webserver, der mir sagt, dass ich nicht draufzugreifen darf. Das Script weiß es doch eh.
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline Threadstarter   Mit Zitat antworten
Alt 05.08.2006, 00:14:01   #8 (permalink)
seraph
Benutzer

ID: 239830
Lose senden

Reg: 24.06.2006
Beiträge: 65
Standard

Evtl. hilft dir das auch weiter:

Wenn du im VirtualHost den DocumentRoot einfach wie folgt setzt, dann brauchst du keine RewriteConditions:

DocumentRoot /home/deinuser/deinweb.de/www/index.php

Alle notwendigen Informationen, die du brauchst kannst du dann per $_SERVER['REQUEST_URI'] auslesen.
Bin eigentlich nie klamm
seraph ist offline   Mit Zitat antworten
Alt 05.08.2006, 00:19:03   #9 (permalink)
joschilein
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose senden

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
Standard

Ich finds ja mal geil, genau das gleiche Problem plagt mich auch gerade..

Da ich mir ein kleines CMS basteln wollte, habe ich erstmal alle Anfragen auf die Zentraldatei umgeleitet zufälligerweise ( ) heißt die bei mir auch index.php
Code:
1:
RewriteRule (.*) index.php
Nun möchte ich Templates umsetzen und dann stellt sich ja auch allgemein die Frage, wie man die Bilder bzw. CSS Dateien von allgemeiner PHP Verarbeitung ausschließt.

Ich möchte dabei allerdings kein zentrales img/ Verzeichnis verwenden, sondern letztlich nur templates/ für Grafiken und CSS freigeben und so ne Art Sammelordner (was in Typo3 "fileadmin" wäre) komplett freigeben, der Rest (und alles was nicht existiert) soll an die index.php gehen.

Leider habe ich mein Standard-Regex-Wissen nie richtig mit Apache verbinden können und die bisherigen Anregungen helfen mir auch nicht ganz ins Ziel.
[I MG]http://img42.imageshack.us/img42/2298/sig8yj.jpg[/IMG]

Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 05.08.2006, 00:19:07   #10 (permalink)
theHacker PREMIUM-User
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.684
Standard

Zitat:
Zitat von seraph
DocumentRoot /home/deinuser/deinweb.de/www/index.php
An den VirtualHost komm ich bei meinem Online-Space nicht. Außerdem entspricht obiger Code ja auch nur der
Code:
1:
RewriteRule ^(.*)$ index.php [L]
-"Leite-was-du-kriegst-auf-index.php"-Zeile.

Ich glaube, meine momentane Lösung (s. Post #3) ist für mich am besten. Noch hatte ich keine Probleme damit
NEU theHacker.blog NEU
– It's just a glitch in the Matrix –

OpenIsles - das freie Insel-Aufbauspiel | www.theHacker.ws v3 | WhatPulse-Team
theHacker ist offline Threadstarter   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP/Mod_rewrite]Mod_rewrite und Session-IDs? BartTheDevil89 Programmierung 6 19.02.2007 16:20:34
2 Probleme mit mod_rewrite birwac66 Programmierung 9 04.11.2006 08:48:22
mod_rewrite Zocker4Life Programmierung 1 02.11.2006 12:07:00
[regxp?] mod_rewrite Kampfwurst Programmierung 8 30.10.2006 16:32:51
mod_rewrite Querulant Programmierung 1 04.08.2006 13:00:50


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08:43 Uhr.