„Privates“ Verzeichnis in Apache nicht zugänglich

„Privates“ Verzeichnis in Apache nicht zugänglich

Das Verzeichnis privatebefindet sich unter meinem DocumentRoot und sollte trotz seines Namens wie jedes andere Verzeichnis zugänglich sein. Aber wenn ich Folgendes RewriteRulezu httpd.conf hinzufüge:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache gibt 403 zurück fürhttp://server/privat/2201Im Fehlerprotokoll steht

client denied by server configuration: /private/2201.html

Wenn ich dann privatein umbenenne foooder 2201.html direkt anfordere, wird die Datei bereitgestellt:

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

Das ist verwirrend. Gibt es eine spezielle Regel für Verzeichnisse mit dem Namen private? Wenn ja – warum funktioniert die direkte Anfrage für 2201.html (obwohl die abgelehnte Anfrage, zumindest laut dem Fehlerprotokolleintrag, dieselbe Ressource zu verarbeiten scheint)?

Antwort1

Soweit ich weiß , gibt es in Apache oder mod_rewrite nichts, was den Namen privatebesonders macht. Aber Ihre Konfiguration könnte eine Standardregel enthalten, die diesen Namen anders behandelt. Versuchen Sie, in Ihrer Konfiguration nach dem Wort zu suchen private, z. B.

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

Wenn Sie eine entsprechende RewriteRule finden, ist diese die Ursache.

Aus Ihren Protokolleinträgen geht klar hervor, dass es privateinsbesondere der Name ist, der das Problem verursacht, und dass es eine RewriteRule sein muss, die dazu führt, dass die Anforderung abgelehnt wird.

Antwort2

Dies ist ein peinlicher Fall von RTM. Apaches Dokumentation bezüglichRegel neu schreibengibt ausdrücklich an, dass Ersetzungszeichenfolgen „als URL-Pfad behandelt werden, es sei denn, im Stammverzeichnis Ihres Dateisystems ist ein Verzeichnis mit dem Namen „www“ vorhanden. In diesem Fall wird es als Dateisystempfad behandelt“, zumindest beim Definieren einer RewriteRule außerhalb eines Verzeichniskontexts.

Da mein Dateisystem /private, aber nicht enthält /foound die URL /private/2212.htmlvon der RewriteRule nicht betroffen ist, ist das obige Muster zu erwarten.

Die Lösung bestand darin, die Flagge hinzuzufügen[PT](Passthrough) zu meiner RewriteRule.

verwandte Informationen