- 相關(guān)推薦
深入理解PHP的.htaccess文件
導(dǎo)語(yǔ):PHP是一種通用開(kāi)源腳本語(yǔ)言。語(yǔ)法吸收了C語(yǔ)言、Java和Perl的特點(diǎn),利于學(xué)習(xí),使用廣泛,主要適用于Web開(kāi)發(fā)領(lǐng)域。下面我們來(lái)深入理解PHP的.htaccess文件,希望對(duì)大家有所幫助。
工作原理和使用方法
.htaccess文件(分布式配置文件)提供了針對(duì)每個(gè)目錄改變配置的方法,即在一個(gè)特定的目錄中放置一個(gè)包含指令的文件,其中的指令作用于此目錄及其所有子目錄。
如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來(lái)改變。例如,需要使用.config ,則可以在服務(wù)器配置文件中按以下方法配置:AccessFileName .config
通常,.htaccess文件使用的配置語(yǔ)法和主配置文件一樣。AllowOverride指令按類(lèi)別決定了.htaccess文件中哪些指令才是有效的。如果一個(gè)指令允許在.htaccess中使用,那么在本手冊(cè)的說(shuō)明中,此指令會(huì)有一個(gè)覆蓋項(xiàng)段,其中說(shuō)明了為使此指令生效而必須在AllowOverride指令中設(shè)置的值。
使用.htaccess文件的場(chǎng)合
一般情況下,不應(yīng)該使用.htaccess文件,除非你對(duì)主配置文件沒(méi)有訪問(wèn)權(quán)限。有一種很常見(jiàn)的誤解,認(rèn)為用戶認(rèn)證只能通過(guò).htaccess文件實(shí)現(xiàn),其實(shí)并不是這樣,把用戶認(rèn)證寫(xiě)在主配置文件中是完全可行的,而且是一種很好的方法。
.htaccess文件應(yīng)該被用在內(nèi)容提供者需要針對(duì)特定目錄改變服務(wù)器的配置而又沒(méi)有root權(quán)限的情況下。如果服務(wù)器管理員不愿意頻繁修改配置,則可以允許用戶通過(guò).htaccess文件自己修改配置,尤其是ISP在同一個(gè)機(jī)器上運(yùn)行了多個(gè)用戶站點(diǎn),而又希望用戶可以自己改變配置的情況下。
雖然如此,一般都應(yīng)該盡可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的段中,而且更高效。
避免使用.htaccess文件有兩個(gè)主要原因。
首先是性能。如果AllowOverride啟用了.htaccess文件,則Apache需要在每個(gè)目錄中查找.htaccess文件,因此,無(wú)論是否真正用到,啟用.htaccess都會(huì)導(dǎo)致性能的下降。另外,對(duì)每一個(gè)請(qǐng)求,都需要讀取一次.htaccess文件。
還有,Apache必須在所有上級(jí)的目錄中查找.htaccess文件,以使所有有效的指令都起作用(參見(jiàn)指令的生效),所以,如果請(qǐng)求/www/htdocs/example中的頁(yè)面,Apache必須查找以下文件:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
總共要訪問(wèn)4個(gè)額外的文件,即使這些文件都不存在。(注意,這可能僅僅由于允許根目錄"/"使用.htaccess ,雖然這種情況并不多。)
其次是安全。這樣會(huì)允許用戶自己修改服務(wù)器的配置,這可能會(huì)導(dǎo)致某些意想不到的修改,所以請(qǐng)認(rèn)真考慮是否應(yīng)當(dāng)給予用戶這樣的特權(quán)。但是,如果給予用戶較少的特權(quán)而不能滿足其需要,則會(huì)帶來(lái)額外的技術(shù)支持請(qǐng)求,所以,必須明確地告訴用戶已經(jīng)給予他們的權(quán)限,說(shuō)明AllowOverride設(shè)置的值,并引導(dǎo)他們參閱相應(yīng)的說(shuō)明,以免日后生出許多麻煩。
注意,在/www/htdocs/example目錄下的.htaccess文件中放置指令,與在主配置文件中段中放置相同指令,是完全等效的。
把配置放在主配置文件中更加高效,因?yàn)橹恍枰贏pache啟動(dòng)時(shí)讀取一次,而不是在每次文件被請(qǐng)求時(shí)都讀取。
指令的生效
.htaccess文件中的配置指令作用于.htaccess文件所在的目錄及其所有子目錄,但是很重要的、需要注意的是,其上級(jí)目錄也可能會(huì)有.htaccess文件,而指令是按查找順序依次生效的,所以一個(gè)特定目錄下的.htaccess文件中的指令可能會(huì)覆蓋其上級(jí)目錄中的.htaccess文件中的指令,即子目錄中的指令會(huì)覆蓋父目錄或者主配置文件中的指令。
例子:/www/htdocs/example1目錄中的.htaccess文件有如下內(nèi)容:Options +ExecCGI
(注意:必須設(shè)置"AllowOverride Options"以允許在.htaccess中使用"Options"指令)
/www/htdocs/example1/example2目錄中的.htaccess文件有如下內(nèi)容:Options Includes
由于第二個(gè).htaccess文件的存在,/www/htdocs/example1/example2中的CGI執(zhí)行是不允許的,而只允許 Options Includes ,它完全覆蓋了之前的設(shè)置。
將.htaccess合并到主配置文件中
正如在配置段(容器)中討論的那樣,.htaccess文件能夠覆蓋段中對(duì)相應(yīng)目錄的設(shè)置,但是也同樣會(huì)被主配置文件中其它類(lèi)型的配置段所覆蓋。這個(gè)特性可以用來(lái)強(qiáng)制實(shí)施某些配置,甚至在AllowOverride已經(jīng)許可的情況下。舉個(gè)例子來(lái)說(shuō),為了強(qiáng)迫在.htaccess中禁止腳本執(zhí)行但不限制其它的情況下,可以這樣:
Allowoverride All
Options +IncludesNoExec -ExecCGI
認(rèn)證舉例
如果你只是為了知道如何認(rèn)證,而直接從這里開(kāi)始看的,有很重要的一點(diǎn)需要注意,有一種常見(jiàn)的誤解,認(rèn)為實(shí)現(xiàn)密碼認(rèn)證必須要使用.htaccess文件,其實(shí)是不正確的。把認(rèn)證指令放在主配置文件的段中是一個(gè)更好的方法,而.htaccess文件應(yīng)該僅僅用于無(wú)權(quán)訪問(wèn)主配置文件的時(shí)候。參見(jiàn)上述關(guān)于何時(shí)應(yīng)該與何時(shí)不應(yīng)該使用.htaccess文件的討論。
有此聲明在先,如果你仍然需要使用.htaccess文件,請(qǐng)繼續(xù)看以下說(shuō)明。.htaccess文件的內(nèi)容:
1 2 3 4 5 | AuthType Basic AuthName "Password Required" AuthUserFile /www/passwords/password.file AuthGroupFile /www/passwords/group.file Require Group admins |
必須設(shè)置 AllowOverride AuthConfig 以允許這些指令生效。
服務(wù)器端包含(SSI)舉例
.htaccess文件的另一個(gè)常見(jiàn)用途是允許一個(gè)特定的目錄使用服務(wù)器端包含(SSI),可以在需要的目錄中放置.htaccess文件,并作如下配置:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
注意,必須同時(shí)設(shè)置 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。
CGI舉例
可以通過(guò).htaccess文件允許在特定的目錄中執(zhí)行CGI程序,需要作如下配置:
Options +ExecCGI
AddHandler cgi-script cgi pl
另外,如下配置可以使給定目錄下的所有文件被視為CGI程序:
Options +ExecCGI
SetHandler cgi-script
注意,必須同時(shí)設(shè)置 AllowOverride Options 和 AllowOverride FileInfo 以使這些指令生效。
疑難解答
如果在.htaccess文件中的某些指令不起作用,可能有多種原因。
最常見(jiàn)的原因是AllowOverride指令沒(méi)有被正確設(shè)置,必須確保沒(méi)有對(duì)此文件區(qū)域設(shè)置 AllowOverride None 。有一個(gè)很好的測(cè)試方法,就是在.htaccess文件隨便增加點(diǎn)無(wú)意義的垃圾內(nèi)容,如果服務(wù)器沒(méi)有返回了一個(gè)錯(cuò)誤消息,那么幾乎可以斷定設(shè)置了 AllowOverride None 。
在訪問(wèn)文檔時(shí),如果收到服務(wù)器的出錯(cuò)消息,應(yīng)該檢查Apache的錯(cuò)誤日志,可以知道.htaccess文件中哪些指令是不允許使用的,也可能會(huì)發(fā)現(xiàn)需要糾正的語(yǔ)法錯(cuò)誤。
【深入理解PHP的.htaccess文件】相關(guān)文章:
php是什么文件03-30
PHP文件怎么操作11-26
php文件鎖怎么用03-27
PHP常用的文件操作函數(shù)11-26
php中目錄文件操作詳談03-01
PHP遍歷目錄文件常用方法03-24
用PHP遍歷目錄下的全部文件02-11
深入理解java的反射04-02