Apache HTTP Server 版本 2.4
.htaccess
檔案可作為變更特定目錄組態的方法。
相關模組 | 相關指令 |
---|---|
.htaccess
檔案。使用 .htaccess
檔案會降低您的 Apache http 伺服器的速度。您可以在 .htaccess
檔案中包含的任何指令都最好設定在 Directory
區塊中,因為該指令將會產生相同的效用,且效能更佳。.htaccess
檔案 (或稱「分散式組態檔」) 可作為變更特定目錄組態的方法。包含一個或多個組態指令的檔案會放置在特定文件中目錄,而這些指令將套用到該目錄及其所有子目錄。
如果你想將 .htaccess
改成其他檔案,你可以使用 AccessFileName
指令變更檔名。例如,如果你想將檔案改成 .config
,你可以把以下內容寫入伺服器設定檔
AccessFileName ".config"
一般來說,.htaccess
檔案使用和 主設定檔 相同的語法。你可以把什麼放入這些檔案是由 AllowOverride
指令決定的。此指令會依類別指定,在 .htaccess
檔案中可以有哪些指令生效。如果允許 .htaccess
檔案中的指令,該指令的說明文件將含有重寫區段,指定 AllowOverride
中必須有哪個值才能允許該指令。
例如,如果你查看 AddDefaultCharset
指令的說明文件,你會發現它允許在 .htaccess
檔案中使用。(請參閱指令摘要中的 Context 列。)重寫 列會讀取 FileInfo
。因此,你必須在 .htaccess
檔案中至少要有 AllowOverride FileInfo
才能讓這個指令生效。
如果你不確定特定指令是否允許在 .htaccess
檔案中,請查看該指令的說明文件,並在 Context 列查看「.htaccess」。
一般來說,只有在無法存取主伺服器設定檔時,才應該使用 .htaccess
檔案。例如,有一個常見的錯誤觀念是使用者驗證應該永遠在 .htaccess
檔案中進行,更近幾年,另一個錯誤觀念是 mod_rewrite
指令必須寫在 .htaccess
檔案中。這並非事實。你可以在主伺服器設定中設定使用者驗證,而這事實上也是較佳的做法。同樣地,在主伺服器設定中,許多部分的 mod_rewrite
指令運作起來更順暢。
.htaccess
檔案應該用在內容提供者需要對每個目錄進行伺服器設定變更,但沒有伺服器系統的 root 存取權限時。如果伺服器管理員不願意頻繁進行設定變更,可能會希望允許個別使用者在 .htaccess
檔案中為自己進行這些變更。這在某些案例中是真的,例如,ISP 在單一機器上主機多個使用者網站,並且希望使用者能夠變更他們的設定時。
不過,一般而言,應盡量避免使用.htaccess
檔案。任何您考慮放入 .htaccess
檔案中的組態,只要在主伺服器組態檔案的 <Directory>
區段中,都能發揮同樣的效果 <Directory>
。
避免使用.htaccess
檔案有兩個主要原因。
第一個原因是效能。當 AllowOverride
AllowOverride
設定為允許使用.htaccess
檔案時,httpd 會在每個目錄中尋找.htaccess
檔案。因此,不論您實際上是否使用.htaccess
檔案,允許.htaccess
檔案都會影響效能!而且,每次要求文件時都會載入.htaccess
檔案。
請進一步注意,httpd 必須在所有較高層級目錄中尋找.htaccess
檔案,才能具備必須套用的完整指示集。(請參閱 套用指示的方式 一節。)因此,如果來自目錄 /www/htdocs/example
中的文件被要求,httpd 必須尋找下列檔案:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
因此,對於出於該目錄的每個檔案存取,還有 4 個其他檔案系統存取,即使沒有其中任何檔案存在也是如此。(請注意,這只會在針對 /
啟用.htaccess
檔案的情況下發生,而這通常不是常態。)
在 .htaccess
背景中針對 RewriteRule
RewriteRule
指示,這些正規表示式必須與目錄的每個請求重新編譯,而在主伺服器組態背景中,它們編譯一次並快取。此外,規則本身較為複雜,因為必須解決隨目錄指定背景和 mod_rewrite
而來的限制。請參閱 重寫指南 以深入了解此主題。
第二個注意事項是安全性。您允許使用者變更伺服器組態,這可能會導致您無法控制的變更。仔細思考您是否要給予您的使用者這項權限。請注意,給予使用者小於他們需要的權限,將導致額外的技術支援請求。請務必清楚告訴您的使用者您已賦予他們的權限層級。特別說明您已如何設定 AllowOverride
AllowOverride
,並將他們引導至相關文件,這將可為您節省很多後續的混淆。
請注意,將含有指示的.htaccess
檔案放入 /www/htdocs/example
目錄,與將相同的指示放入您的主伺服器組態的 <Directory "/www/htdocs/example">
目錄指定區段完全是等效的
.htaccess
檔案位於/www/htdocs/example
/www/htdocs/example
中 .htaccess 檔案的內容AddType text/example ".exm"
httpd.conf
檔案區段<Directory "/www/htdocs/example"> AddType text/example ".exm" </Directory>
然而,將此組態設定於伺服器組態檔內所產生的效能衝擊較小,因為組態會在 httpd 啟動時載入一次,而不是每次要求檔案時。
透過將 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
檔案可以覆寫對應目錄的
區段,但會被來自主組態檔的其他類型組態區段所覆寫。這個事實可用於強制某些組態,即使在有寬鬆的 <Directory>
設定時。例如,要在允許任何其他設定於 AllowOverride
.htaccess
中時防止指令碼執行,你可以使用
<Directory "/www/htdocs"> AllowOverride All </Directory> <Location "/"> Options +IncludesNoExec -ExecCGI </Location>
DocumentRoot
是 /www/htdocs
。如果您直接跳到此文件的部分,瞭解如何執行驗證,需要注意一件事情。常見的一個錯誤觀念,就是您必須使用 .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
檔案的另一常見用途是為特定目錄啟用伺服器端包含。這個工作可以使用下列設定指令完成,將它們放置在希望的目錄中的 .htaccess
檔案中
Options +Includes AddType text/html shtml AddHandler server-parsed shtml
請注意,AllowOverride Options
與 AllowOverride FileInfo
都必須生效,這些指令才能發揮作用。
有關伺服器端包含的完整討論,請參閱 SSI 教學。
在 .htaccess
檔案中使用 <a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a>
時,請注意,每個目錄的內容會有所不同。特別是,規則被視為是相對於目前目錄,而非原始要求的 URI。請考慮下列範例
# In httpd.conf RewriteRule "^/images/(.+)\.jpg" "/images/$1.png" # In .htaccess in root dir RewriteRule "^images/(.+)\.jpg" "images/$1.png" # In .htaccess in images/ RewriteRule "^(.+)\.jpg" "$1.png"
在您文件目錄中的 .htaccess
中,會從提供給 <a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a>
的值中移除開頭的斜線;在 images
子目錄中,會從中移除 /images/
。因此,您的正規表示式也需要略過該部分。
有關使用 mod_rewrite
的更多詳細資料,請參閱 mod_rewrite 文件。
最後,您可能想使用 .htaccess
檔案來允許在特定目錄中執行 CGI 程式。可以使用下列設定實作
Options +ExecCGI AddHandler cgi-script cgi pl
或者,如果您希望目錄中的所有檔案都被視為 CGI 程式,可以使用下列設定完成
Options +ExecCGI SetHandler cgi-script
請注意,AllowOverride Options
與 AllowOverride FileInfo
都必須生效,這些指令才能發揮作用。
有關 CGI 編程與設定的完整討論,請參閱 CGI 教學。
當您在 .htaccess
檔案中設定設定指令,卻沒有得到預期效果時,可能有許多事情出錯。
最常見的問題是,AllowOverride
未設定成使你的設定指令生效。確定你已在有效的文件範圍內設定AllowOverride None
。測試這個指令的方法是在你的.htaccess
檔案中放入垃圾文字,然後重新載入網頁。如果沒有產生伺服器錯誤,則你幾乎絕對已設定為AllowOverride None
。
另一方面,如果你在嘗試存取文件時得到伺服器錯誤,則檢查你的 httpd 錯誤記錄。它可能會告訴你.htaccess
檔案中所使用的指令不允許使用。
[週五 9月 17日 18:43:16 2010] [警戒] [用戶端 192.168.200.51] /var/www/html/.htaccess:此處不允許 DirectoryIndex
這會顯示你使用了從未允許在.htaccess
檔案中使用的指令,或你根本沒有將AllowOverride
設定成足夠的等級來應用你使用的指令。請參閱特定指令的說明文件,以確定哪一種情況發生。
或者,它可能會告訴你你的指令用法存在語法錯誤。
[週六 8月 09日 16:22:34 2008] [警戒] [用戶端 192.168.200.51] /var/www/html/.htaccess:RewriteCond:標籤分隔符號錯誤
在這種情況下,錯誤訊息應是特定於你所提交的某個語法錯誤。