2013-07-12 30 views
10

Tôi gặp phải tình huống từ chối truy cập vào tất cả các tệp trong thư mục con của trang web của mình. Tôi đã thêm một tập tin htaccess vào thư mục con này và thêm một từ chối từ tất cả các chỉ thị cho nó. Tuy nhiên, tôi cũng có một tệp htaccess trong thư mục gốc của trang, cho phép các loại tệp cụ thể và có vẻ như các loại tệp này vẫn có thể truy cập được trong thư mục con mặc dù tôi không còn muốn chúng nữa. Tôi có một giải pháp cho điều này (xem bên dưới), nhưng tôi cảm thấy như phải có một cách tốt hơn. Dưới đây là hai tập tin htaccess của tôi:Từ chối tất cả trong thư mục con htaccess không ghi đè các quy tắc tệp trong thư mục gốc htaccess

gốc .htaccess

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

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

Thư mục con .htaccess

# Deny access to everything 
deny from all 

Cách giải quyết:

Thư mục con .htaccess

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

Điều này làm những gì tôi muốn, nhưng tôi cảm thấy muốn có một cách để làm cho từ chối từ tất cả các công việc tuyên bố của chính nó. Có ai biết làm thế nào?

Trả lời

11

Bạn có thể có gốc .htaccess của bạn như thế này

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

Không cần cho một .htaccess riêng trong thư mục phụ.

Bạn đang cho phép truy cập vào tất cả các tệp html trong .htaccess trong Thư mục gốc và không từ chối nó ở bất kỳ đâu trong thư mục con trong trường hợp đầu tiên. Apache phân tích tất cả các quy tắc của bạn và sử dụng quy tắc đối sánh cuối cùng, không giống như tường lửa (sử dụng lần truy cập đối sánh quy tắc đầu tiên). Các quy tắc toàn cầu được đọc đầu tiên và các quy tắc cụ thể sau này.

+0

Ah, cảm ơn bạn. Tôi thấy bây giờ tôi đã đi sai. Tôi đã nhầm tưởng rằng tất cả các quy tắc trong htaccess gốc sẽ được đánh giá theo sau bởi tất cả các quy tắc trong thư mục con htaccess. Tôi đã không nhận ra rằng trên thực tế có một sự hợp nhất của các thành phần trong hai tập tin, kết quả của nó được áp dụng trong một lần truyền. – FrolickingFerret

6

Thứ tự các chỉ thị trong apache thực sự không rõ ràng.

Bạn có mô tả đầy đủ về tài liệu này trên tài liệu "How the sections are merged".

Dưới đây là một đoạn trích:

Trình tự sáp nhập là:

  • <Directory> (trừ biểu thức thông thường) và .htaccess thực hiện cùng một lúc (với .htaccess, nếu được phép, trọng <Directory>)
  • <DirectoryMatch> (và <Directory ~>)
  • <Files><FilesMatch> hoàn tất đồng thời
  • <Location><LocationMatch> tiến hành đồng thời
  • <If>

Vì vậy, những gì xảy ra là chỉ thị <File> của bạn được xử lý sau những thư mục (như là một .htaccess là trong thực tế, một chỉ thị Directory cho thư mục hiện tại).

Nó hoạt động trong dụ cho bạn như là đề tài file chỉ là trên thực tế lồng trong các chỉ thị mục .htaccess, và chỉ thị tập tin thứ hai được áp dụng sau khi thư mục cha một.

Bạn không thể sử dụng chỉ thị <FileMatch> trong phụ huynh, nơi tệp từ thư mục con sẽ bị loại trừ, vì tệpMatch chỉ hoạt động trên tên tệp chứ không phải trên đường dẫn tệp. Nhưng bạn có thể thử với một LocationMatch, nhưng nó có lẽ sẽ kết thúc trong một cái khá phức tạp, để ngăn chặn vị trí hacks với dấu chấm.

Trong thực tế, giải pháp tôi sẽ sử dụng ở đây là một RedirectMatch trong thư mục mẹ:

RedirectMatch 403 ^.*\.html$ 
+0

Cảm ơn câu trả lời! Tôi đã xem xét liên kết bạn cung cấp và cùng với câu trả lời của bạn Tôi tin rằng bây giờ tôi đã hiểu được vấn đề. Tuy nhiên, tôi không thực sự chắc chắn cách RedirectMatch bạn cung cấp sẽ từ chối truy cập vào tất cả các tệp trong thư mục con cụ thể đó ... – FrolickingFerret

+2

Biểu mẫu thực tế sẽ ngăn truy cập vào tất cả các tệp html. Tôi đã viết rằng một thời gian dài trước đây, nhưng tôi nghĩ rằng công thức đúng là một cái gì đó giống như: trong tất cả các thư mục con, nhưng một cái gì đó như 'RedirectMatch 403^.subdirectory/* \. Html $' – regilero

Các vấn đề liên quan