Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          先介紹一個(gè)不錯(cuò)的修改.htaccess向?qū)У木W(wǎng)站: http://www.htaccesseditor.com/en.shtml


          .htaccess文件提供了針對每個(gè)目錄改變配置的方法。

          工作原理和使用方法

          .htaccess文件(或者"分布式配置文件")提供了針對每個(gè)目錄改變配置的方法,即在一個(gè)特定的目錄中放置一個(gè)包含指令的文件,其中的指令作用于此目錄及其所有子目錄。

          說明:

          如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來改變。例如,需要使用.config?,則可以在服務(wù)器配置文件中按以下方法配置:

          AccessFileName .config

          通常,.htaccess文件使用的配置語法和主配置文件一樣。AllowOverride指令按類別決定了.htaccess文件中哪些指令才是有效的。如果一個(gè)指令允許在.htaccess中使用,那么在本手冊的說明中,此指令會有一個(gè)覆蓋項(xiàng)段,其中說明了為使此指令生效而必須在AllowOverride指令中設(shè)置的值。

          例如,本手冊對AddDefaultCharset指令的闡述表明此指令可以用于.htaccess文件中(見"作用域"項(xiàng)),而覆蓋項(xiàng)一行是FileInfo?,那么為了使.htaccess中的此指令有效,則至少要設(shè)置AllowOverride FileInfo?。

          例子:

          作用域 server config, virtual host, directory, .htaccess
          覆蓋項(xiàng) FileInfo

          如果不能確定某個(gè)指令是否可以用于.htaccess文件,可以查閱手冊中對指令的說明,看在"作用域"行中是否有".htaccess" 。

          (不)使用.htaccess文件的場合

          一般情況下,不應(yīng)該使用.htaccess文件,除非你對主配置文件沒有訪問權(quán)限。有一種很常見的誤解,認(rèn)為用戶認(rèn)證只能通過.htaccess文件實(shí)現(xiàn),其實(shí)并不是這樣,把用戶認(rèn)證寫在主配置文件中是完全可行的,而且是一種很好的方法。

          .htaccess文件應(yīng)該被用在內(nèi)容提供者需要針對特定目錄改變服務(wù)器的配置而又沒有root權(quán)限的情況下。如果服務(wù)器管理員不愿意頻繁修改配置,則可以允許用戶通過.htaccess文件自己修改配置,尤其是ISP在同一個(gè)機(jī)器上運(yùn)行了多個(gè)用戶站點(diǎn),而又希望用戶可以自己改變配置的情況下。

          雖然如此,一般都應(yīng)該盡可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的<Directory>段中,而且更高效。

          避免使用.htaccess文件有兩個(gè)主要原因。

          首先是性能。如果AllowOverride啟用了.htaccess文件,則Apache需要在每個(gè)目錄中查找.htaccess文件,因此,無論是否真正用到,啟用.htaccess都會導(dǎo)致性能的下降。另外,對每一個(gè)請求,都需要讀取一次.htaccess文件。

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

          /.htaccess
          /www/.htaccess
          /www/htdocs/.htaccess
          /www/htdocs/example/.htaccess

          總共要訪問4個(gè)額外的文件,即使這些文件都不存在。(注意,這可能僅僅由于允許根目錄"/"使用.htaccess?,雖然這種情況并不多。)

          其次是安全。這樣會允許用戶自己修改服務(wù)器的配置,這可能會導(dǎo)致某些意想不到的修改,所以請認(rèn)真考慮是否應(yīng)當(dāng)給予用戶這樣的特權(quán)。但是,如果給予用戶較少的特權(quán)而不能滿足其需要,則會帶來額外的技術(shù)支持請求,所以,必須明確地告訴用戶已經(jīng)給予他們的權(quán)限,說明AllowOverride設(shè)置的值,并引導(dǎo)他們參閱相應(yīng)的說明,以免日后生出許多麻煩。

          注意,在/www/htdocs/example目錄下的.htaccess文件中放置指令,與在主配置文件中<Directory /www/htdocs/example>段中放置相同指令,是完全等效的。

          /www/htdocs/example目錄下的.htaccess文件:

          /www/htdocs/example目錄下的.htaccess文件的內(nèi)容:

          AddType text/example .exm

          httpd.conf文件中摘錄的內(nèi)容:

          <Directory /www/htdocs/example>
          AddType text/example .exm
          </Directory>

          但是,把配置放在主配置文件中更加高效,因?yàn)橹恍枰贏pache啟動時(shí)讀取一次,而不是在每次文件被請求時(shí)都讀取。

          AllowOverride設(shè)置為none可以完全禁止使用.htaccess文件:

          AllowOverride None

          指令的生效

          .htaccess文件中的配置指令作用于.htaccess文件所在的目錄及其所有子目錄,但是很重要的、需要注意的是,其上級目錄也可能會有.htaccess文件,而指令是按查找順序依次生效的,所以一個(gè)特定目錄下的.htaccess文件中的指令可能會覆蓋其上級目錄中的.htaccess文件中的指令,即子目錄中的指令會覆蓋父目錄或者主配置文件中的指令。

          例子:

          /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文件能夠覆蓋<Directory>段中對相應(yīng)目錄的設(shè)置,但是也同樣會被主配置文件中其它類型的配置段所覆蓋。這個(gè)特性可以用來強(qiáng)制實(shí)施某些配置,甚至在AllowOverride已經(jīng)許可的情況下。舉個(gè)例子來說,為了強(qiáng)迫在.htaccess中禁止腳本執(zhí)行但不限制其它的情況下,可以這樣:

          <Directory />
          Allowoverride All
          </Directory>

          <Location />
          Options +IncludesNoExec -ExecCGI
          </Location>

          認(rèn)證舉例

          如果你只是為了知道如何認(rèn)證,而直接從這里開始看的,有很重要的一點(diǎn)需要注意,有一種常見的誤解,認(rèn)為實(shí)現(xiàn)密碼認(rèn)證必須要使用.htaccess文件,其實(shí)是不正確的。把認(rèn)證指令放在主配置文件的<Directory>段中是一個(gè)更好的方法,而.htaccess文件應(yīng)該僅僅用于無權(quán)訪問主配置文件的時(shí)候。參見上述關(guān)于何時(shí)應(yīng)該與何時(shí)不應(yīng)該使用.htaccess文件的討論。

          有此聲明在先,如果你仍然需要使用.htaccess文件,請繼續(xù)看以下說明。

          .htaccess文件的內(nèi)容:

          AuthType Basic
          AuthName "Password Required"
          AuthUserFile /www/passwords/password.file
          AuthGroupFile /www/passwords/group.file
          Require Group admins

          必須設(shè)置?AllowOverride AuthConfig?以允許這些指令生效。

          更詳細(xì)的說明,請參見認(rèn)證、授權(quán)、訪問控制。

          服務(wù)器端包含(SSI)舉例

          .htaccess文件的另一個(gè)常見用途是允許一個(gè)特定的目錄使用服務(wù)器端包含(SSI),可以在需要的目錄中放置.htaccess文件,并作如下配置:

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

          注意,必須同時(shí)設(shè)置?AllowOverride Options??AllowOverride FileInfo?以使這些指令生效。

          更詳細(xì)的有關(guān)服務(wù)器端包含的說明,請參見SSI指南。

          CGI舉例

          可以通過.htaccess文件允許在特定的目錄中執(zhí)行CGI程序,需要作如下配置:

          Options +ExecCGI
          AddHandler cgi-script cgi pl

          另外,如下配置可以使給定目錄下的所有文件被視為CGI程序:

          Options +ExecCGI
          SetHandler cgi-script

          注意,必須同時(shí)設(shè)置?AllowOverride Options??AllowOverride FileInfo?以使這些指令生效。

          更詳細(xì)的有關(guān)CGI編程和配置的說明,請參見CGI指南

          疑難解答

          如果在.htaccess文件中的某些指令不起作用,可能有多種原因。

          最常見的原因是AllowOverride指令沒有被正確設(shè)置,必須確保沒有對此文件區(qū)域設(shè)置?AllowOverride None?。有一個(gè)很好的測試方法,就是在.htaccess文件隨便增加點(diǎn)無意義的垃圾內(nèi)容,如果服務(wù)器沒有返回了一個(gè)錯(cuò)誤消息,那么幾乎可以斷定設(shè)置了?AllowOverride None?

          在訪問文檔時(shí),如果收到服務(wù)器的出錯(cuò)消息,應(yīng)該檢查Apache的錯(cuò)誤日志,可以知道.htaccess文件中哪些指令是不允許使用的,也可能會發(fā)現(xiàn)需要糾正的語法錯(cuò)誤。

          posted on 2011-05-12 08:43 禮物 閱讀(848) 評論(1)  編輯  收藏

          評論

          # re: .htaccess文件 2011-05-26 14:11 就是上
          .htaccess用處確實(shí)很多  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 合江县| 台南市| 平和县| 靖宇县| 广饶县| 内丘县| 隆子县| 分宜县| 乡宁县| 蕲春县| 长子县| 仪征市| 余干县| 凤台县| 偃师市| 襄垣县| 塔河县| 彭泽县| 彭山县| 永福县| 佛冈县| 商水县| 浮山县| 金坛市| 丰县| 迭部县| 理塘县| 青浦区| 吉林省| 波密县| 禹州市| 吕梁市| 谷城县| 景宁| 郎溪县| 临高县| 横峰县| 屏山县| 秦安县| 平谷区| 阿拉善盟|