2013-07-12 26 views
10

Ho una situazione in cui sto cercando di negare l'accesso a tutti i file in una sottodirectory del mio sito web. Ho aggiunto un file htaccess a questa sottodirectory e ho aggiunto un rifiuto da tutte le direttive ad esso. Tuttavia, ho anche un file .htaccess nella root del sito, che permette di tipi di file specifici, e sembra che questi tipi di file sono ancora accessibili nella sottodirectory anche se non voglio più che siano. Ho una soluzione per questo (vedi sotto), ma sento che ci deve essere un modo migliore. Qui sono i miei due file .htaccess:Deny da tutti nella sottodirectory .htaccess non ignorando le regole di file in radice .htaccess

Root .htaccess

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

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

sottodirectory .htaccess

# Deny access to everything 
deny from all 

Soluzione:

sottodirectory .htaccess

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

Questo fa quello che voglio, ma mi sento come se ci dovrebbe essere un modo per rendere il negare da tutti i lavori dichiarazione stessa. Qualcuno sa come?

risposta

11

si può avere la .htaccess Radice come questo

# 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> 

Non v'è alcuna necessità di un .htaccess separata nella sottodirectory.

Si consente l'accesso a tutti i file HTML nel vostro .htaccess nella directory principale e non negando ovunque nella directory sub nel primo caso. Apache analizza tutte le regole e utilizza l'ultima regola di corrispondenza, a differenza dei firewall (che utilizza la prima corrispondenza della regola). Le regole globali vengono lette prima e le regole specifiche in seguito.

+0

Ah, grazie. Vedo ora dove ho sbagliato. Ho erroneamente creduto che tutte le regole nel root htaccess sarebbero state valutate, seguite da tutte le regole nella sottodirectory htaccess. Non mi sono reso conto che in effetti c'è un'unione dei componenti nei due file, il cui risultato è applicato in un singolo passaggio. – FrolickingFerret

6

dell'Ordine delle direttive, in apache non è davvero evidente.

È descrizione completa di esso sulla documentazione "How the sections are merged".

Ecco un estratto:

L'ordine di fusione è:

  • <Directory> (tranne le espressioni regolari) e .htaccess fatto contemporaneamente (con .htaccess, se consentito, sovrascrivendo <Directory>)
  • <DirectoryMatch> (e <Directory ~>)
  • <Files> e <FilesMatch> fatto contemporaneamente
  • <Location> e <LocationMatch> fatto contemporaneamente
  • <If>

Quindi quello che succede è che la direttiva <File> è gestita dopo quelli Directory (come .htaccess è in realtà una direttiva Directory per la directory corrente).

Funziona nel vostro esempio dato che queste direttive di file sono di fatto annidate nelle direttive della directory .htaccess e la seconda direttiva File viene applicata dopo quella della directory padre.

Non è possibile utilizzare una direttiva <FileMatch> nel padre, in cui i file dalla sottodirectory sarebbero esclusi, poiché fileMatch sta solo lavorando sul nome del file e non sul percorso del file. Ma potresti magari provare con un LocationMatch, ma finirebbe in un modo abbastanza complesso, per proibire anche gli hack di localizzazione con punti.

In realtà la soluzione vorrei utilizzare: ecco un RedirectMatch nella cartella principale:

RedirectMatch 403 ^.*\.html$ 
+0

Grazie per la risposta! Ho dato un'occhiata al link che hai fornito, e insieme alla tua risposta credo che ora capisco il problema. Tuttavia, non sono sicuro di come il RedirectMatch fornito negherà l'accesso a tutti i file in quella particolare sottocartella ... – FrolickingFerret

+2

Il modulo effettivo impedirebbe l'accesso a tutti i file html. Ho scritto questo a lungo termine, ma penso che la formula giusta sia più simile a: in tutte le sottodirectory, ma qualcosa come 'RedirectMatch 403^.subdirectory/* \. Html $' – regilero

Problemi correlati