2011-04-21 23 views
1

這是關於Apache,特別是.htaccess指令。我們假設存在/index.htmApache,.htaccess:FilesMatch是否匹配URI或實際文件名?

我想有允許被訪問(僅.htm)文件的白名單,所以我想出了這一點:

Order deny,allow 
Deny from all 
<FilesMatch "\.htm$"> 
    Allow from all 
</FilesMatch> 

我看到的是,請求www.domain.com/index.htm當一切工作正常,但當請求www.domain.com(空URI)時,我得到一個403響應(當然,我應該使用默認的index.htm)。

經過一些測試,我發現這是因爲FilesMatch不允許使用空字符串,所以我想知道我是否理解得很好:[question#1a]我可以說FilesMatch匹配URI並且不是直接真正的文件名(文件系統中的一個)?

在此之後我試圖重寫空字符串:

RewriteEngine on 
RewriteRule ^$ index.htm [L] 

,沒有運氣,所以[問題#1B]我可以說,FilesMatch拒絕之前訪問任何重寫還是我做錯了什麼?

到底是唯一的工作解決方案,我想出來的是包括FilesMatch的正則表達式爲空字符串:

<FilesMatch "(^|\.htm)$"> 

[問題#2]這真的是最好的,甚至是唯一的解決這個問題的方法?我無法在網上找到我的解決方案,所以我擔心我從一開始就做錯了什麼...

謝謝!

回答

2

關於您的主要問題和問題1a,FilesMatch在文件路徑上匹配,使用LocationMatch來匹配網址。

這是記錄在這裏:http://httpd.apache.org/docs/2.0/sections.html#file-and-web

你的問題1B,mod_rewrite的可授權開始之前重寫,如前所述這裏:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalAPI

爲什麼你重寫規則沒有工作,這是我不清楚,但是我平時寫:

RewriteRule ^/$ index.htm [L] 

IIRC,因爲總是有一個「/」,無論在服務器URL和一個文件夾裏面,但我可能是錯在這一點上。