webpilot hat geschrieben:Ich möchte den Zugriff auf mehrere Ordner (abc, 123 und xyz) per htaccess verhindern. Dazu habe ich folgenden Code in der htaccess:
Code: Alles auswählen
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/abc
RewriteCond %{REQUEST_URI} ^/123
RewriteCond %{REQUEST_URI} ^/xyz
RewriteRule ^.* - [F]
Das funktioniert irgendwie nicht.
Das ist vor allen Dingen gleich mehrfach ungeschickt:
- Erstens könnte es dir passieren, dass du mit einem Muster à la /abc nicht nur das Verzeichnis /abc/ erwürgst, sondern auch noch /abcde, /abc123 usw. Soll ein Verzeichnis angesprochen werden, den Pfad bzw. das Muster immer mit einem Schrägstrich enden lassen.
- Zweitens kann REQUEST_URI nicht gleichzeitig /abc, /123 und /xyz sein, daher funktioniert es auch nicht. Du müsstest die RewriteCond-Zeilen mit Oder verknüpfen.
- Drittens ist es zu viel Aufwand, für jeden einzelnen Pfad ein gesondertes Muster zu definieren. In Mustern lässt sich mit | ebenfalls eine Oder-Verknüpfung herstellen, bei FilesMatch hast du das doch auch gemacht.
- Viertens ist es unsinnig, wegen eines einfachen URI-Vergleiches REQUEST_URI hervorzukramen, RewriteRule vergleicht diesen Pfad ebenfalls.
- Fünftens ist es unsinnig, „
Anfang, gefolgt von irgendwas“ (
^.*) als Muster zu nehmen. „
Irgendwas“ reicht vollkommen.
Bis hierhin
RewriteRule ^(abc|123|xyz)/ - [F] (ohne jegliche RewriteCond), jedoch:
- Sechstens ist mod_rewrite zu viel Aufwand.
Weiterhin habe ich folgendes versucht:
Code: Alles auswählen
<FilesMatch "(/abc|/123|/xyz)">
deny from all
</FilesMatch>
FilesMatch arbeitet offenbar nur mit Dateien, definitiv aber nur mit dem Basisnamen des Pfades, d.h. ein führender Schrägstrich hat darin nichts zu suchen. Wenn überhaupt, dann etwas in der Richtung
^(abc|123|xyz)$, eventuell mit abschließendem Schrägstrich vor dem Dollarzeichen - aber wie gesagt, mit Verzeichnissen scheint <Files> bzw. <FilesMatch> eh nicht zu funktionieren (daher wohl sinnigerweise auch der Name).
Bessere Lösungsansätze:
1. RedirectMatch 403 ^/(abc|123|xyz)/
2. In jedem betreffenden Ordner eine .htaccess mit der Zeile
deny from all ablegen.