.htaccess RewriteRule
JoM
- webserver
Hallo,
ich hätte gerne, dass alle Anfragen auf Unterverzeichnisse (außer ordner1, ordner2 und ordner3) auf index.php umgeleitet werden, wobei die drei genannten Ordner durch gesonderte "Deny from all"-.htaccess geblockt werden. Also beispielsweise:
/sadsajdk/test.pdf -> /index.php?page=sadsajdk/test.pdf
/saklln/2.doc -> /index.php?saklln/2.doc
/ordner1/wqeqwe.pdf -> Geblockt
/ordner2/dsfdsf.doc -> Geblockt
(/dasfhg.txt -> /dasfhg.txt) //Keine Umleitung
Ich kenne mich nicht arg gut mit mod_rewrite aus, habe es mit folgendem Code versucht, was aber nicht funktioniert hat (Außerdem soll der Zugriff auf .htaccess-Dateien aus Sicherheitsgründen gesperrt werden):
RewriteEngine On
Options +FollowSymlinks
RewriteBase /fms/
RewriteCond %{REQUEST_FILENAME} ^.htaccess$
RewriteRule [1](.*)$ index.php?id=$1
Die .htaccess hatte aber keinerlei Auswirkungen - kann mir jemand helfen, wie ich den Code korrigieren muss, um den gewünschten Effekt zu bekommen? Wäre super - schon mal danke im Vorraus.
Gruß,
JoM
^(ordner1|ordner2|ordner3) ↩︎
Hellihello
lass doch mal die rewritecond weg. das sieht mir aus wie "wenn am Anfang ein punkt gefolgt von htaccess steht".
RewriteCond %{REQUEST_FILENAME} ^.htaccess$
Dank und Gruß,
(Außerdem soll der Zugriff auf .htaccess-Dateien aus Sicherheitsgründen gesperrt werden)
Das sollte schon aus der httpd.conf resultieren. Ist das etwa bei dir nicht der Fall?
RewriteRule [1](.*)$ index.php?id=$1
Das geht so nicht. In einer negierten Zeichenklasse werden einzelne Zeichen [^abc] und nicht wort oder wort oder wort ausgeschlossen. Letzteres wäre mit einem negative lookahead möglich, aber unnötig, da du das über eine Condition einfach prüfen kannst.
wobei die drei genannten Ordner durch gesonderte "Deny from all"-.htaccess geblockt werden.
Dann brauchst du auch keine Condition mehr, da du sowieso in den Unterverzeichnissen ein .htaccess-Datei anlegst, kannst du dort auch gleich
RewriteEngine off
notieren. Dann musst du die Ordner auch nicht mehr ausschließen.
Deine Regel könnte also so aussehen:
RewriteRule ^([^/]+/.+) index.php?page=$1 [L]
^([^/]+/.+) = beginnt mit 1 oder n Zeichen ohne Slash, gefolgt von einem Slash, gefolgt von 1 oder n beliebigen Zeichen
RewriteBase /fms/
steht im Widerspruch zu deinen Beispielen. Solltest du die Direktive richtig verwenden, müssten deine Beispiele so aussehen:
/fms/sadsajdk/test.pdf -> /fms/index.php?page=sadsajdk/test.pdf
und die .htaccess-Datei im Ordner /fms/ liegen. Ist das der Fall?
^(ordner1|ordner2|ordner3) ↩︎
Hellihello
könnte also so aussehen:
RewriteRule ^([^/]+/.+) index.php?page=$1 [L]
^([^/]+/.+) = beginnt mit 1 oder n Zeichen ohne Slash, gefolgt von einem Slash, gefolgt von 1 oder n beliebigen Zeichen
Warum soll das denn nicht mit einem Slash beginnen? Taucht denn bei example.com/irgendwas/nochwas der Slash fürs Rule auf? Ich dachte, dann wäre "irgendwas/nochwas" die URL die rewritten würde. Und warum muss ein Slash folgen?
Dank und Gruß,
^([^/]+/.+) = beginnt mit 1 oder n Zeichen ohne Slash, gefolgt von einem Slash, gefolgt von 1 oder n beliebigen Zeichen
Warum soll das denn nicht mit einem Slash beginnen?
Das ist eine einfache Prüfung, ob zumindest ein Unterverzeichnis vorliegt. Natürlich könntest du auch .*/.* notieren, allerdings könnte die Regel im Hinblick auf das Backtracking (laut PCRE manual kommt es bei der PCRE-Bibliothek zum Backtracking) nicht so performanceoptimiert sein.
Taucht denn bei example.com/irgendwas/nochwas der Slash fürs Rule auf? Ich dachte, dann wäre "irgendwas/nochwas" die URL die rewritten würde.
Ja, genau, im Verzeichniskontext prüfst du gegen irgendwas/nochwas. Der Teil [^/]+/ passt auf irgendwas/ und .+ auf den Rest rechts davon.
Und warum muss ein Slash folgen?
Der OP möchte nur Unterverzeichnisse behandelt wissen. Sonst würde die Regel auch auf foo, foo.bar im aktuellen Verzeichnis passen.