.htaccess
檔提供了一種基於每個目錄進行配置更改的方法。
1. 為什麼/如何使用.htaccess
.htaccess
檔(或“分佈式配置檔”)提供了一種基於每個目錄進行配置更改的方法。包含一個或多個配置指令的檔放在特定的文檔目錄中,並且指令適用於該目錄及其所有子目錄。
注:如果要將
.htaccess
檔調用為其他檔,可以使用AccessFileName
指令更改檔案名。例如,如果您希望調用檔.config
,則可以將以下內容放入伺服器配置檔中:AccessFileName ".config"
通常,.htaccess
檔使用與主配置檔相同的語法。可以在這些檔中放置的內容由AllowOverride
指令決定。該指令在類別中指定了在.htaccess
檔中找到的指令將被遵守的指令。如果.htaccess
檔中允許指令,則該指令的文檔將包含Override
部分,指定AllowOverride
中必須包含的值,以便允許該指令。
2. 什麼時候使用/不使用.htaccess檔
通常,只有在無法訪問主伺服器配置檔時才應使用.htaccess
檔。例如,有一種常見的誤解,即用戶身份驗證應始終在.htaccess
檔中完成,並且在最近幾年,另一種誤解是mod_rewrite
指令必須放在.htaccess
檔中。這根本不是那麼回事。您可以將用戶身份驗證配置放在主伺服器配置中,事實上,這是執行操作的首選方式。同樣,mod_rewrite
指令在許多方面在主伺服器配置中更好地工作。
.htaccess
檔應該用於內容提供者需要在每個目錄的基礎上對伺服器進行配置更改但在伺服器系統上沒有root訪問許可權的情況。如果伺服器管理員不願意頻繁進行配置更改,則可能需要允許各個用戶自己在.htaccess
檔中進行這些更改。例如,在ISP在一臺電腦上託管多個用戶站點並希望其用戶能夠更改其配置的情況下尤其如此。
但是,通常,應盡可能避免使用.htaccess
檔。您考慮放入.htaccess
檔的任何配置都可以在主伺服器配置檔的<Directory>
部分中有效地進行。
避免使用.htaccess
檔有兩個主要原因。
第一個是表現。當AllowOverride
設置為允許使用.htaccess
檔時,httpd將在每個目錄中查找.htaccess
檔。因此,允許.htaccess
檔會導致性能下降,無論您是否真正使用它們。此外,每次請求文檔時都會加載.htaccess
檔。
還要注意,httpd必須在所有更高級別的目錄中查找.htaccess
檔,以便擁有必須應用的完整指令。因此,如果從目錄/www/htdocs/example
請求檔,httpd必須查找以下檔:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
因此,對於該目錄中的每個檔訪問,即使這些檔都不存在,也有4個額外的檔系統訪問。(請注意,只有.htaccess
檔為/啟用時才會出現這種情況,通常情況並非如此。)
對於RewriteRule
指令,在.htaccess
上下文中,必須使用對目錄的每個請求重新編譯這些正則運算式,而在主伺服器配置上下文中,它們將被編譯一次並緩存。此外,規則本身更複雜,因為必須解決每個目錄上下文和mod_rewrite
帶來的限制。
第二個考慮因素是安全問題。您允許用戶修改伺服器配置,這可能導致無法控制的更改。仔細考慮是否要為用戶提供此許可權。另請注意,為用戶提供的許可權少於他們所需的許可權將導致其他技術支持請求。確保清楚地告訴用戶您給予他們的許可權級別。準確地指定你設置AllowOverride
的內容,並將它們指向相關的文檔,以後會為你節省很多困惑。
請注意,它完全等同於將.htaccess
檔放在包含指令的目錄/www/htdocs/example
中,並將相同的指令放在主伺服器的Directory
部分<Directory "/www/htdocs/example">
中組態。
.htaccess
檔在目錄/www/htdocs/example
之中:
AddType text/example ".exm"
httpd.conf檔中的內容 -
<Directory "/www/htdocs/example">
AddType text/example ".exm"
</Directory>
但是,將此配置放在伺服器配置檔中將導致較少的性能損失,因為配置在httpd啟動時加載一次,而不是每次請求檔時。
通過將AllowOverride
指令設置為none
,可以完全禁用.htaccess
檔的使用:
AllowOverride None
3. 如何應用指令
在.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>
4. 認證示例
有一種常見的誤解是您需要使用.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
必須有效才能使這些指令生效。
5. 伺服器端包含示例
.htaccess
檔的另一個常見用途是為特定目錄啟用伺服器端包含。這可以通過以下配置指令完成,放置在所需目錄中的.htaccess
檔中:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
注意,
AllowOverride Options
和AllowOverride FileInfo
必須同時對這些指令生效才有效。
6. .htaccess檔中的重寫規則
在.htaccess
檔中使用RewriteRule
時,請注意每個目錄的上下文會稍微改變一下。特別是,規則被認為是相對於當前目錄,而不是原始請求的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
中,從提供給RewriteRule
的值中刪除前導斜杠,並在images
子目錄中刪除/images/
。因此,正則運算式也需要省略該部分。
7. CGI示例
最後,您可能希望使用.htaccess
檔來允許在特定目錄中執行CGI程式。這可以通過以下配置實現:
Options +ExecCGI
AddHandler cgi-script cgi pl
另外,如果希望在給定目錄中的所有檔被認為是CGI程式,這可能具有以下配置來實現:
Options +ExecCGI
SetHandler cgi-script
請注意,AllowOverride Options
和AllowOverride FileInfo
必須同時對這些指令生效才有效。