2013-07-12 24 views
10

我有一種情況,我試圖拒絕訪問我的網站的子目錄中的所有文件。我在這個子目錄中添加了一個htaccess文件,並在所有指令中添加了拒絕。但是,我在站點根目錄中還有一個htaccess文件,它允許特定的文件類型,並且好像這些文件類型仍然可以在子目錄中訪問,即使我不再希望它們是。我有一個解決方法(見下文),但我覺得必須有更好的方法。這裏是我的兩個htaccess中:拒絕所有在子目錄htaccess中不覆蓋根htaccess中的文件規則

根的.htaccess

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

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

子目錄的.htaccess

# Deny access to everything 
deny from all 

解決方法:

子目錄的.htaccess

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

這就是我想要的,但我覺得應該有一種方法可以讓所有聲明工作本身的否定。有誰知道如何?

回答

11

你可以有你的根的.htaccess這樣

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

沒有必要在分目錄中的單獨的.htaccess。

您允許訪問根目錄中.htaccess中的所有html文件,並且不會在第一種情況下拒絕它在子目錄中的任何位置。 Apache不像防火牆(使用第一個規則匹配命中)解析所有規則並使用最後一條匹配規則。先閱讀全球規則,然後再閱讀具體規則。

+0

啊,謝謝。我現在看到我出錯的地方。我錯誤地認爲,根htaccess中的所有規則都會被評估,然後是子目錄htaccess中的所有規則。我沒有意識到,實際上這兩個文件中的組件是合併的,其結果是一次性應用的。 – FrolickingFerret

6

Apache中的指令順序並不明顯。

在文檔"How the sections are merged"上有完整的說明。

下面是一個摘錄:

合併的順序是:

  • <Directory>(除了正則表達式)和htaccess的同時進行(與htaccess的,如果允許,重寫<Directory>
  • <DirectoryMatch>(和<Directory ~>
  • <Files><FilesMatch>完成同時
  • <Location><LocationMatch>同時進行
  • <If>

所以會發生什麼是你<File>指令處理的目錄那些(作爲的.htaccess其實是在爲一個目錄指令當前目錄)。

它在你給定的例子中工作,因爲這些文件指令實際上嵌套在.htaccess目錄指令中,第二個File指令應用在父目錄之後。

您不能在父目錄中使用<FileMatch>指令,因爲fileMatch只能處理文件名,而不能處理文件路徑,因此子目錄中的文件將被排除。但是你也許可以嘗試使用LocationMatch,但也可能以相當複雜的方式結束,以禁止帶點的位置攻擊。

其實我想在這裏使用的解決方案是在父文件夾中的RedirectMatch:

RedirectMatch 403 ^.*\.html$ 
+0

感謝您的回答!我看了一下你提供的鏈接,並且連同你的回答,我相信我現在已經明白了這個問題。但是,我不太確定您提供的RedirectMatch將如何拒絕訪問該特定子文件夾中的所有文件... – FrolickingFerret

+2

實際的表單將阻止訪問所有html文件。我寫了很久以前,但我認爲正確的公式更像是:在所有子目錄中,但像'RedirectMatch 403^.subdirectory/* \。html $' – regilero

相關問題