Apache .htaccess檔

.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 OptionsAllowOverride 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 OptionsAllowOverride FileInfo必須同時對這些指令生效才有效。


上一篇: Apache CGI動態內容 下一篇: Apache反向代理