<-
Apache > HTTP Server > 文件 > 版本 2.4 > 操作指南/教程

Apache HTTP Server Tutorial: .htaccess 檔案

可用語言:  en  |  es  |  fr  |  ja  |  ko  |  pt-br 

.htaccess 檔案可作為變更特定目錄組態的方法。

Support Apache!

另請參閱

top

.htaccess 檔案

如果您能存取 httpd 主要伺服器組態檔,則應完全避免使用 .htaccess 檔案。使用 .htaccess 檔案會降低您的 Apache http 伺服器的速度。您可以在 .htaccess 檔案中包含的任何指令都最好設定在 Directory 區塊中,因為該指令將會產生相同的效用,且效能更佳。
top

它們的用途/使用方法

.htaccess 檔案 (或稱「分散式組態檔」) 可作為變更特定目錄組態的方法。包含一個或多個組態指令的檔案會放置在特定文件中目錄,而這些指令將套用到該目錄及其所有子目錄。

注意事項

如果你想將 .htaccess 改成其他檔案,你可以使用 AccessFileName 指令變更檔名。例如,如果你想將檔案改成 .config,你可以把以下內容寫入伺服器設定檔

AccessFileName ".config"

一般來說,.htaccess 檔案使用和 主設定檔 相同的語法。你可以把什麼放入這些檔案是由 AllowOverride 指令決定的。此指令會依類別指定,在 .htaccess 檔案中可以有哪些指令生效。如果允許 .htaccess 檔案中的指令,該指令的說明文件將含有重寫區段,指定 AllowOverride 中必須有哪個值才能允許該指令。

例如,如果你查看 AddDefaultCharset 指令的說明文件,你會發現它允許在 .htaccess 檔案中使用。(請參閱指令摘要中的 Context 列。)重寫 列會讀取 FileInfo。因此,你必須在 .htaccess 檔案中至少要有 AllowOverride FileInfo 才能讓這個指令生效。

範例

內容 伺服器設定、虛擬主機、目錄、.htaccess
重寫 FileInfo

如果你不確定特定指令是否允許在 .htaccess 檔案中,請查看該指令的說明文件,並在 Context 列查看「.htaccess」。

top

何時(不)使用 .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
top

指令的套用方式

找到於 .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 "/www/htdocs">
    AllowOverride All
</Directory>

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>
此範例假設你的 DocumentRoot/www/htdocs
top

驗證範例

如果您直接跳到此文件的部分,瞭解如何執行驗證,需要注意一件事情。常見的一個錯誤觀念,就是您必須使用 .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 必須生效,這些指令才能發揮作用。

有關驗證與授權的完整討論,請參閱 驗證教學

top

伺服器端包含範例

.htaccess 檔案的另一常見用途是為特定目錄啟用伺服器端包含。這個工作可以使用下列設定指令完成,將它們放置在希望的目錄中的 .htaccess 檔案中

Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml

請注意,AllowOverride OptionsAllowOverride FileInfo 都必須生效,這些指令才能發揮作用。

有關伺服器端包含的完整討論,請參閱 SSI 教學

top

.htaccess 檔案中的改寫規則

.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 文件

top

CGI 範例

最後,您可能想使用 .htaccess 檔案來允許在特定目錄中執行 CGI 程式。可以使用下列設定實作

Options +ExecCGI
AddHandler cgi-script cgi pl

或者,如果您希望目錄中的所有檔案都被視為 CGI 程式,可以使用下列設定完成

Options +ExecCGI
SetHandler cgi-script

請注意,AllowOverride OptionsAllowOverride FileInfo 都必須生效,這些指令才能發揮作用。

有關 CGI 編程與設定的完整討論,請參閱 CGI 教學

top

疑難排解

當您在 .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:標籤分隔符號錯誤

在這種情況下,錯誤訊息應是特定於你所提交的某個語法錯誤。

可用語言:  en  |  es  |  fr  |  ja  |  ko  |  pt-br 

top

評論

注意事項
這不是問答區。在此發表的評論應針對如何改善文件或伺服器提出建議,我們的管理員可能會在實作或視為無效/離題後將其移除。關於如何管理 Apache HTTP Server 的疑問應發佈到我們的 IRC 頻道 #httpd(在 Libera.chat),或傳送至我們的郵件清單