解析
概述來說,htaccess檔案是Apache伺服器中的一個配置檔案,它負責相關目錄下的網頁配置。通過htaccess檔案,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變檔案擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。
Unix、Linux系統或者是任何版本的Apache Web伺服器都是支持.htaccess的,但是有的主機服務商可能不允許你自定義自己的.htaccess檔案。
啟用.htaccess,需要修改httpd.conf,啟用AllowOverride,並可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他檔案名稱,可以用AccessFileName指令來改變。例如,需要使用.config ,則可以在伺服器配置檔案中按以下方法配置:AccessFileName .config 。
籠統地說,.htaccess可以幫我們實現包括:資料夾密碼保護、用戶自動重定向、自定義錯誤頁面、改變你的檔案擴展名、封禁特定IP位址的用戶、只允許特定IP位址的用戶、禁止目錄列表,以及使用其他檔案作為index檔案等一些功能。
工作
.htaccess檔案(或者"分散式配置檔案")提供了針對每個目錄改變配置的方法,即在一個特定的目錄中放置一個包含指令的檔案,其中的指令作用於此目錄及其所有子目錄。
說明
如果需要使用.htaccess以外的其他檔案名稱,可以用AccessFileName指令來改變。例如,需要使用.config ,則可以在伺服器配置檔案中按以下方法配置:
AccessFileName .config
通常,.htaccess檔案使用的配置語法和主配置檔案一樣。AllowOverride指令按類別決定了.htaccess檔案中哪些指令才是有效的。如果一個指令允許在.htaccess中使用,那么在本手冊的說明中,此指令會有一個覆蓋項段,其中說明了為使此指令生效而必須在AllowOverride指令中設定的值。
例如,本手冊對AddDefaultCharset指令的闡述表明此指令可以用於.htaccess檔案中(見"作用域"項),而覆蓋項一行是FileInfo ,那么為了使.htaccess中的此指令有效,則至少要設定 AllowOverride FileInfo 。
優缺點
採用.htaccess檔案的優缺點:
通常網路管理員採用.htaccess檔案來進行用戶組的目錄許可權訪問控制。沒有必要將所有的HTTPd伺服器、配置檔案以及目錄訪問許可權全部授權給管理員。利用當前目錄的.htaccess檔案可以允許管理員靈活的隨時按需改變目錄訪問策略。
採用.htaccess的缺點在於:當系統有成百上千個目錄,每個目錄下都有對應的.htaccess檔案時,網路管理員將會對如何配置全局訪問策略無從下手。同時,由於.htaccess檔案十分被容易覆蓋,很容易造成用戶上一時段能訪問目錄,而下一時段又訪問不了的情況發生。最後,.htaccess檔案也很容易被非授權用戶得到,安全性不高。
例子
作用域 | server config, virtual host, directory, .htaccess |
覆蓋項 | FileInfo |
如果不能確定某個指令是否可以用於.htaccess檔案,可以查閱手冊中對指令的說明,看在"作用域"行中是否有".htaccess" 。
不使用
一般情況下,不應該使用.htaccess檔案,除非你對主配置檔案沒有訪問許可權。有一種很常見的誤解,認為用戶認證只能通過.htaccess檔案實現,其實並不是這樣,把用戶認證寫在主配置檔案中是完全可行的,而且是一種很好的方法。
.htaccess檔案應該被用在內容提供者需要針對特定目錄改變伺服器的配置而又沒有root許可權的情況下。如果伺服器管理員不願意頻繁修改配置,則可以允許用戶通過.htaccess檔案自己修改配置,尤其是ISP在同一個機器上運行了多個用戶站點,而又希望用戶可以自己改變配置的情況下。
雖然如此,一般都應該儘可能地避免使用.htaccess檔案。任何希望放在.htaccess檔案中的配置,都可以放在主配置檔案的<Directory>段中,而且更高效。
避免使用.htaccess檔案有兩個主要原因。
首先是性能。如果AllowOverride啟用了.htaccess檔案,則Apache需要在每個目錄中查找.htaccess檔案,因此,無論是否真正用到,啟用.htaccess都會導致性能的下降。另外,對每一個請求,都需要讀取一次.htaccess檔案。
還有,Apache必須在所有上級的目錄中查找.htaccess檔案,以使所有有效的指令都起作用(參見指令的生效),所以,如果請求/www/htdocs/example中的頁面,Apache必須查找以下檔案:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
總共要訪問4個額外的檔案,即使這些檔案都不存在。(注意,這可能僅僅由於允許根目錄"/"使用.htaccess ,雖然這種情況並不多。)
其次是安全。這樣會允許用戶自己修改伺服器的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予用戶這樣的特權。但是,如果給予用戶較少的特權而不能滿足其需要,則會帶來額外的技術支持請求,所以,必須明確地告訴用戶已經給予他們的許可權,說明AllowOverride設定的值,並引導他們參閱相應的說明,以免日後生出許多麻煩。
注意,在/www/htdocs/example目錄下的.htaccess檔案中放置指令,與在主配置檔案中<Directory /www/htdocs/example>段中放置相同指令,是完全等效的。
/www/htdocs/example目錄下的.htaccess檔案的內容:
AddType text/example .exm
conf檔案中摘錄的內容:
1.conf檔案中摘錄的內容:
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
但是,把配置放在主配置檔案中更加高效,因為只需要在Apache啟動時讀取一次,而不是在每次檔案被請求時都讀取。
將AllowOverride設定為none可以完全禁止使用.htaccess檔案:
AllowOverride None
指令範圍
.htaccess檔案中的配置指令作用於.htaccess檔案所在的目錄及其所有子目錄,但是很重要的、需要注意的是,其上級目錄也可能會有.htaccess檔案,而指令是按查找順序依次生效的,所以一個特定目錄下的.htaccess檔案中的指令可能會覆蓋其上級目錄中的.htaccess檔案中的指令,即子目錄中的指令會覆蓋父目錄或者主配置檔案中的指令。
例子:
/www/htdocs/example1目錄中的.htaccess檔案有如下內容:
Options +ExecCGI
(注意:必須設定"AllowOverride Options"以允許在.htaccess中使用"Options"指令)
/www/htdocs/example1/example2目錄中的.htaccess檔案有如下內容:
Options Includes
由於第二個.htaccess檔案的存在,/www/htdocs/example1/example2中的CGI執行是不允許的,而只允許 Options Includes ,它完全覆蓋了之前的設定。
將.htaccess合併到主配置檔案中
正如在配置段(容器)中討論的那樣,.htaccess檔案能夠覆蓋<Directory>段中對相應目錄的設定,但是也同樣會被主配置檔案中其它類型的配置段所覆蓋。這個特性可以用來強制實施某些配置,甚至在AllowOverride已經許可的情況下。舉個例子來說,為了強迫在.htaccess中禁止腳本執行但不限制其它的情況下,可以這樣:
<Directory />
Allowoverride All
</Directory>
<Location />
Options +IncludesNoExec -ExecCGI
</Location>
認證舉例
如果你只是為了知道如何認證,而直接從這裡開始看的,有很重要的一點需要注意,有一種常見的誤解,認為實現密碼認證必須要使用.htaccess檔案,其實是不正確的。把認證指令放在主配置檔案的<Directory>段中是一個更好的方法,而.htaccess檔案應該僅僅用於無權訪問主配置檔案的時候。參見上述關於何時應該與何時不應該使用.htaccess檔案的討論。
有此聲明在先,如果你仍然需要使用.htaccess檔案,請繼續看以下說明。
.htaccess檔案的內容:
AuthType Basic
AuthName "Password Required"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file
Require Group admins
必須設定 AllowOverride AuthConfig 以允許這些指令生效。
伺服器端舉例
.htaccess檔案的另一個常見用途是允許一個特定的目錄使用伺服器端包含(SSI),可以在需要的目錄中放置.htaccess檔案,並作如下配置:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
注意,必須同時設定 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。
CGI舉例
可以通過.htaccess檔案允許在特定的目錄中執行CGI程式,需要作如下配置:
Options +ExecCGI
AddHandler cgi-script cgi pl
另外,如下配置可以使給定目錄下的所有檔案被視為CGI程式:
Options +ExecCGI
SetHandler cgi-script
注意,必須同時設定 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。
.htaccess工具
不會寫的朋友,在這介紹一款很不錯.htaccess的重定向—URL重寫工具rewriting-tool
疑難解答
如果在.htaccess檔案中的某些指令不起作用,可能有多種原因。
最常見的原因是AllowOverride指令沒有被正確設定,必須確保沒有對此檔案區域設定 AllowOverride None 。有一個很好的測試方法,就是在.htaccess檔案隨便增加點無意義的垃圾內容,如果伺服器沒有返回了一個錯誤訊息,那么幾乎可以斷定設定了 AllowOverride None 。
在訪問文檔時,如果收到伺服器的出錯訊息,應該檢查Apache的錯誤日誌,可以知道.htaccess檔案中哪些指令是不允許使用的,也可能會發現需要糾正的語法錯誤。