2013-07-12 15 views
10

Mam sytuację, w której próbuję odmówić dostępu do wszystkich plików w podkatalogu mojej witryny. Dodałem plik htaccess do tego podkatalogu i dodałem do niego odmowę ze wszystkich dyrektyw. Jednak mam również plik htaccess w katalogu głównym, który dopuszcza określone typy plików, i wygląda na to, że te typy plików są nadal dostępne w podkatalogu, mimo że już nie chcę, aby były. Mam obejście tego problemu (patrz poniżej), ale czuję, że musi istnieć lepszy sposób. Oto moje dwa pliki .htaccess:Odmowa dostępu ze wszystkich w podkatalogu htaccess nie przesłania reguł plików w htaccess root

głównej .htaccess

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

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

podkatalogów .htaccess

# Deny access to everything 
deny from all 

Obejście:

podkatalogów .htaccess

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

Robi to, co chcę, ale wydaje mi się, że powinien istnieć sposób, by samemu odmówić dostępu do wszystkich zdań. Czy ktoś wie jak?

Odpowiedz

11

Możesz mieć .htaccess korzenia, jak to

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

Nie ma potrzeby stosowania oddzielnego .htaccess w podkatalogu.

Umożliwiasz dostęp do wszystkich plików html w pliku .htaccess w Katalogu głównym, a nie w żadnym przypadku nie odmawiasz dostępu do niego w katalogu podkatalogu. Apache analizuje wszystkie reguły i używa ostatniej pasującej reguły, w przeciwieństwie do zapór ogniowych (które używa pierwszego trafienia w regułę). Zasady globalne są odczytywane jako pierwsze, a zasady szczegółowe później.

+0

Ach, dziękuję. Teraz widzę, gdzie się pomyliłem. Pomyliłem się błędnie, że wszystkie reguły w htaccess root będą oceniane, a następnie wszystkie reguły w katalogu htaccess. Nie zdawałem sobie sprawy, że w rzeczywistości istnieje scalenie komponentów w dwóch plikach, których wynik jest stosowany w jednym przebiegu. – FrolickingFerret

6

Porządek dyrektyw w Apache naprawdę nie jest oczywisty.

Masz pełny opis tego w dokumentacji "How the sections are merged".

Oto fragment:

Kolejność łączenia się:

  • <Directory> (z wyjątkiem wyrażeń regularnych) i .htaccess wykonywane jednocześnie (z .htaccess, jeśli jest to dozwolone, nadrzędnymi <Directory>)
  • <DirectoryMatch> (i <Directory ~>)
  • <Files> i <FilesMatch> zrobione jednocześnie
  • <Location> i <LocationMatch> zrobić jednocześnie
  • <If>

Więc co się dzieje, jest to, że dyrektywa <File> manipulowaniu po te Directory (jako .htaccess jest w istocie dyrektywa katalog dla aktualny katalog).

Działa na danym przykładzie, ponieważ dyrektywy plików asses są zagnieżdżone w dyrektywach katalogu .htaccess, a druga dyrektywa File jest stosowana po katalogu nadrzędnym jeden.

Nie możesz użyć dyrektywy <FileMatch> w katalogu nadrzędnym, w której pliki z podkatalogu byłyby wykluczone, ponieważ fileMatch działa tylko na nazwie pliku, a nie na ścieżce pliku. Ale możesz spróbować z LocationMatch, ale może się to skończyć w dość skomplikowanym, by zabezpieczyć także lokalizacje hackami z kropkami.

W rzeczywistości rozwiązanie użyłbym tutaj jest RedirectMatch w folderze nadrzędnym:

RedirectMatch 403 ^.*\.html$ 
+0

Dzięki za odpowiedź! Przyjrzałem się linkowi, który dostarczyłeś, i wraz z twoją odpowiedzią uważam, że teraz rozumiem problem. Jednak nie jestem pewien, w jaki sposób dostarczona przez ciebie funkcja RedirectMatch odmówi dostępu do wszystkich plików w tym podfolderze ... – FrolickingFerret

+2

Rzeczywisty formularz uniemożliwiłby dostęp do wszystkich plików html. Napisałem to dawno temu, ale myślę, że odpowiednia formuła jest bardziej podobna: we wszystkich podkatalogach, ale coś w rodzaju 'RedirectMatch 403^.katalog/* \. Html $' – regilero

Powiązane problemy