當前位置:才華齋>計算機>php語言>

深入理解PHP的.htaccess檔案

php語言 閱讀(1.35W)

導語:PHP是一種通用開源指令碼語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。下面我們來深入理解PHP的cess檔案,希望對大家有所幫助。

深入理解PHP的.htaccess檔案

工作原理和使用方法

cess檔案(分散式配置檔案)提供了針對每個目錄改變配置的方法,即在一個特定的目錄中放置一個包含指令的檔案,其中的指令作用於此目錄及其所有子目錄。

如果需要使用cess以外的其他檔名,可以用AccessFileName指令來改變。例如,需要使用ig ,則可以在伺服器配置檔案中按以下方法配置:AccessFileName ig

通常,cess檔案使用的配置語法和主配置檔案一樣。AllowOverride指令按類別決定了cess檔案中哪些指令才是有效的。如果一個指令允許在cess中使用,那麼在本手冊的說明中,此指令會有一個覆蓋項段,其中說明了為使此指令生效而必須在AllowOverride指令中設定的值。

使用cess檔案的場合

一般情況下,不應該使用cess檔案,除非你對主配置檔案沒有訪問許可權。有一種很常見的誤解,認為使用者認證只能通過cess檔案實現,其實並不是這樣,把使用者認證寫在主配置檔案中是完全可行的,而且是一種很好的方法。

cess檔案應該被用在內容提供者需要針對特定目錄改變伺服器的配置而又沒有root許可權的情況下。如果伺服器管理員不願意頻繁修改配置,則可以允許使用者通過cess檔案自己修改配置,尤其是ISP在同一個機器上運行了多個使用者站點,而又希望使用者可以自己改變配置的情況下。

雖然如此,一般都應該儘可能地避免使用cess檔案。任何希望放在cess檔案中的配置,都可以放在主配置檔案的段中,而且更高效。

避免使用cess檔案有兩個主要原因。

首先是效能。如果AllowOverride啟用了cess檔案,則Apache需要在每個目錄中查詢cess檔案,因此,無論是否真正用到,啟用cess都會導致效能的下降。另外,對每一個請求,都需要讀取一次cess檔案。

還有,Apache必須在所有上級的目錄中查詢cess檔案,以使所有有效的指令都起作用(參見指令的生效),所以,如果請求/www/htdocs/example中的頁面,Apache必須查詢以下檔案:

/cess

/www/cess

/www/htdocs/cess

/www/htdocs/example/cess

總共要訪問4個額外的檔案,即使這些檔案都不存在。(注意,這可能僅僅由於允許根目錄"/"使用cess ,雖然這種情況並不多。)

其次是安全。這樣會允許使用者自己修改伺服器的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予使用者這樣的特權。但是,如果給予使用者較少的特權而不能滿足其需要,則會帶來額外的技術支援請求,所以,必須明確地告訴使用者已經給予他們的許可權,說明AllowOverride設定的值,並引導他們參閱相應的說明,以免日後生出許多麻煩。

注意,在/www/htdocs/example目錄下的cess檔案中放置指令,與在主配置檔案中段中放置相同指令,是完全等效的。

把配置放在主配置檔案中更加高效,因為只需要在Apache啟動時讀取一次,而不是在每次檔案被請求時都讀取。

指令的生效

cess檔案中的配置指令作用於cess檔案所在的目錄及其所有子目錄,但是很重要的、需要注意的是,其上級目錄也可能會有cess檔案,而指令是按查詢順序依次生效的,所以一個特定目錄下的cess檔案中的指令可能會覆蓋其上級目錄中的cess檔案中的指令,即子目錄中的指令會覆蓋父目錄或者主配置檔案中的指令。

例子:/www/htdocs/example1目錄中的cess檔案有如下內容:Options +ExecCGI

(注意:必須設定"AllowOverride Options"以允許在cess中使用"Options"指令)

/www/htdocs/example1/example2目錄中的cess檔案有如下內容:Options Includes

由於第二個cess檔案的存在,/www/htdocs/example1/example2中的CGI執行是不允許的,而只允許 Options Includes ,它完全覆蓋了之前的設定。

將cess合併到主配置檔案中

正如在配置段(容器)中討論的那樣,cess檔案能夠覆蓋段中對相應目錄的設定,但是也同樣會被主配置檔案中其它型別的配置段所覆蓋。這個特性可以用來強制實施某些配置,甚至在AllowOverride已經許可的情況下。舉個例子來說,為了強迫在cess中禁止指令碼執行但不限制其它的`情況下,可以這樣:

Allowoverride All

Options +IncludesNoExec -ExecCGI

認證舉例

如果你只是為了知道如何認證,而直接從這裡開始看的,有很重要的一點需要注意,有一種常見的誤解,認為實現密碼認證必須要使用cess檔案,其實是不正確的。把認證指令放在主配置檔案的段中是一個更好的方法,而cess檔案應該僅僅用於無權訪問主配置檔案的時候。參見上述關於何時應該與何時不應該使用cess檔案的討論。

有此宣告在先,如果你仍然需要使用cess檔案,請繼續看以下說明。cess檔案的內容:

12345AuthType Basic AuthName "Password Required" AuthUserFile /www/passwords/ AuthGroupFile /www/passwords/ Require Group admins

必須設定 AllowOverride AuthConfig 以允許這些指令生效。

伺服器端包含(SSI)舉例

cess檔案的另一個常見用途是允許一個特定的目錄使用伺服器端包含(SSI),可以在需要的目錄中放置cess檔案,並作如下配置:

Options +Includes

AddType text/html shtml

AddHandler server-parsed shtml

注意,必須同時設定 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。

CGI舉例

可以通過cess檔案允許在特定的目錄中執行CGI程式,需要作如下配置:

Options +ExecCGI

AddHandler cgi-script cgi pl

另外,如下配置可以使給定目錄下的所有檔案被視為CGI程式:

Options +ExecCGI

SetHandler cgi-script

注意,必須同時設定 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。

疑難解答

如果在cess檔案中的某些指令不起作用,可能有多種原因。

最常見的原因是AllowOverride指令沒有被正確設定,必須確保沒有對此檔案區域設定 AllowOverride None 。有一個很好的測試方法,就是在cess檔案隨便增加點無意義的垃圾內容,如果伺服器沒有返回了一個錯誤訊息,那麼幾乎可以斷定設定了 AllowOverride None 。

在訪問文件時,如果收到伺服器的出錯訊息,應該檢查Apache的錯誤日誌,可以知道cess檔案中哪些指令是不允許使用的,也可能會發現需要糾正的語法錯誤。