2013-07-12 9 views
10

Ich habe eine Situation, in der ich versuche, den Zugriff auf alle Dateien in einem Unterverzeichnis meiner Website zu verweigern. Ich habe diesem Unterverzeichnis eine htaccess-Datei hinzugefügt und ihr die Anweisung deny from all hinzugefügt. Allerdings habe ich auch eine htaccess-Datei im Site-Root, die bestimmte Dateitypen erlaubt, und es scheint, als ob diese Dateitypen im Unterverzeichnis immer noch verfügbar sind, obwohl ich sie nicht mehr haben möchte. Ich habe einen Workaround dafür (siehe unten), aber ich habe das Gefühl, dass es einen besseren Weg geben muss. Hier sind meine zwei .htaccess-Dateien:Verweigern von allen im Unterverzeichnis htaccess nicht überschreiben Dateiregeln in root htaccess

Wurzel .htaccess

# Deny access to everything by default 
Order Deny,Allow 
deny from all 

# Allow access to html files 
<Files *.html> 
    allow from all 
</Files> 

Subdirectory .htaccess

# Deny access to everything 
deny from all 

Umgehung:

Subdirectory .htaccess

# Deny access to everything 
Order Allow,Deny 
deny from all 
<Files *.*> 
    deny from all 
</Files> 

Dies tut, was ich will, aber ich fühle mich wie es sollte einen Weg sein, um die Leugner von allen Aussagen Arbeit allein zu machen. Weiß jemand wie?

Antwort

11

Sie können Ihre Wurzel .htaccess wie diese

# Deny access to everything by default 
Order Deny,Allow 
deny from all 

# Allow access to html files 
<Files *.html> 
    allow from all 
</Files> 

# Deny access to sub directory 
<Files subdirectory/*> 
    deny from all 
</Files> 

Es besteht keine Notwendigkeit für einen separaten .htaccess in dem Unterverzeichnis haben.

Sie erlauben den Zugriff auf alle HTML-Dateien in Ihrem .htaccess im Root-Verzeichnis und verweigern es im ersten Fall nirgendwo im Unterverzeichnis. Apache analysiert alle Ihre Regeln und verwendet die letzte übereinstimmende Regel, im Gegensatz zu Firewalls (die den ersten Regeltreffer-Treffer verwenden). Die globalen Regeln werden zuerst gelesen und die spezifischen Regeln später.

+0

Ah, danke. Ich sehe jetzt, wo ich falsch gelaufen bin. Ich hatte fälschlicherweise geglaubt, dass alle Regeln im root htaccess ausgewertet würden, gefolgt von allen Regeln im Unterverzeichnis htaccess. Ich habe nicht bemerkt, dass es tatsächlich eine Zusammenführung der Komponenten in den zwei Dateien gibt, deren Ergebnis in einem einzigen Durchgang angewendet wird. – FrolickingFerret

6

Reihenfolge der Anweisungen in Apache ist wirklich nicht offensichtlich.

Sie haben eine vollständige Beschreibung davon in der Dokumentation "How the sections are merged". Hier

ist ein Auszug:

Die Reihenfolge der Verschmelzung ist:

  • <Directory> (mit Ausnahme von regulären Ausdrücken) und .htaccess gleichzeitig durchgeführt (mit .htaccess, wenn erlaubt, zwingenden <Directory>)
  • <DirectoryMatch> (und <Directory ~>)
  • <Files> und <FilesMatch> done gleichzeitig
  • <Location> und <LocationMatch> getan gleichzeitig
  • <If>

Also, was passiert ist, dass Ihre <File> Richtlinie nach den Verzeichnis diejenigen behandelt wird (als .htaccess in der Tat eine Directory-Richtlinie für die ist Aktuelles Verzeichnis).

Es funktioniert in Ihrem gegebenen Beispiel, wie diese Dateien Direktiven tatsächlich in den .htaccess Directory-Direktiven verschachtelt sind, und die zweite Datei-Direktive nach dem übergeordneten Verzeichnis angewendet wird.

Sie können keine Direktive im übergeordneten Verzeichnis verwenden, in der Dateien aus dem Unterverzeichnis ausgeschlossen werden, da fileMatch nur am Dateinamen und nicht am Dateipfad arbeitet. Aber Sie könnten vielleicht mit einem LocationMatch versuchen, aber es würde vielleicht in einem ziemlich komplexen enden, um auch Location-Hacks mit Punkten zu verbieten.

Tatsächlich ist die Lösung, die ich hier verwenden würde ein RedirectMatch in dem übergeordneten Ordner ist:

RedirectMatch 403 ^.*\.html$ 
+0

Danke für die Antwort! Ich habe mir den Link angesehen, den Sie angegeben haben, und zusammen mit Ihrer Antwort glaube ich, dass ich das Problem jetzt verstehe. Allerdings bin ich nicht wirklich sicher, wie die von Ihnen angegebene RedirectMatch den Zugriff auf alle Dateien in diesem bestimmten Unterordner verweigert ... – FrolickingFerret

+2

Die tatsächliche Form würde den Zugriff auf alle HTML-Dateien verhindern. Ich habe das vor langer Zeit geschrieben, aber ich denke, die richtige Formel ist eher etwas wie: in allen Unterverzeichnissen, aber etwas wie RedirectMatch 403^.subverzeichnis/* \. Html $ ' – regilero

Verwandte Themen