Apache HTTP Server 版本2.2
說明 | 在非線程型MPM(prefork )上提供對CGI腳本執(zhí)行的支持 |
---|---|
狀態(tài) | 基本(B) |
模塊名 | cgi_module |
源文件 | mod_cgi.c |
任何具有MIME類型application/x-httpd-cgi
或者被cgi-script
處理器處理的文件都將被作為CGI腳本對待并由服務(wù)器運(yùn)行,它的輸出將被返回給客戶端?梢酝ㄟ^兩種途徑使文件成為CGI腳本,一種是文件具有已由AddType
指令定義的擴(kuò)展名,另一種是文件位于ScriptAlias
目錄中。
當(dāng)服務(wù)器調(diào)用一個CGI腳本時會往運(yùn)行環(huán)境中添加一個叫做DOCUMENT_ROOT
的變量。這個變量將包含DocumentRoot
指令的值。
要得到對Apache中使用CGI腳本的介紹,參看使用CGI產(chǎn)生動態(tài)內(nèi)容。
在UNIX下使用多線程型的MPM時,應(yīng)該使用模塊mod_cgid
代替本模塊。在用戶層面,這兩個模塊本質(zhì)上是相同的。
Apache將按照CGI規(guī)范設(shè)置環(huán)境變量,有以下幾個:
AcceptPathInfo
指令為 off
,這個變量將不可用。如果沒有明確設(shè)置AcceptPathInfo
,默認(rèn)的行為是mod_cgi
將會接受路徑信息(URI里腳本文件名之后的/more/path/info
),即使服務(wù)器核心對請求的附加路徑信息返回"404 NOT FOUND"錯誤。省略AcceptPathInfo
指令與將它設(shè)置為 On
對mod_cgi
請求具有相同的效果。HostnameLookups
指令被設(shè)置為"on
"(默認(rèn)是"off")并且對訪問主機(jī)的DNS反查確實(shí)找到了主機(jī)名時才被設(shè)置。IdentityCheck
被設(shè)置為 on
并且訪問主機(jī)支持識別協(xié)議時才被設(shè)置。注意這個變量不能信賴,因為它很容易被假冒。而且如果客戶端與服務(wù)器之間存在代理的話,這個變量通常完全沒有用處。調(diào)試CGI腳本一直以來都很困難,主要是因為在腳本不能正確運(yùn)行時不可能研究它的輸出(stdout和stderr)。這些指令為發(fā)生錯誤時提供了更詳細(xì)的錯誤日志。
配置好以后,CGI錯誤日志會記錄任何沒有正確運(yùn)行的CGI。每個運(yùn)行失敗的CGI腳本都有幾行信息被記錄。頭兩行總是這樣的格式:
%% [time] request-line
%% HTTP-status CGI-script-filename
如果錯誤是CGI腳本無法執(zhí)行,日志文件會包含以下額外的兩行:
%%error
error-message
或者,如果錯誤是腳本執(zhí)行結(jié)果返回了不正確的頭信息(經(jīng)常是由于腳本內(nèi)部的bug),會記錄以下兩行:
%request
All HTTP request headers received
POST or PUT entity (if any)
%response
All headers output by the CGI script
%stdout
CGI standard output
%stderr
CGI standard error
如果腳本沒有在stdout和stderr上輸出可能會沒有%stdout和%stderr部分。
說明 | CGI腳本錯誤日志文件的位置 |
---|---|
語法 | ScriptLog file-path |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_cgi , mod_cgid |
ScriptLog
指令設(shè)置了CGI腳本錯誤日志文件的位置。如果沒有設(shè)置ScriptLog
,就不會創(chuàng)建錯誤日志。如果設(shè)置了,所有CGI錯誤都會被記入作為指令參數(shù)的文件中。如果是一個相對路徑則以ServerRoot
為參照。
ScriptLog logs/cgi_log
此日志會以運(yùn)行子進(jìn)程的用戶身份打開,比如由主服務(wù)器配置部分的User
指令指定的用戶。這意味著,或者該用戶對腳本日志所在目錄具有寫權(quán)限,或者日志文件由此用戶手工創(chuàng)建并設(shè)置為可寫。如果你把腳本日志放在你的主日志目錄中,不要為了讓運(yùn)行子進(jìn)程的用戶可以寫日志而改變目錄的權(quán)限。
注意,腳本日志是為了給創(chuàng)建CGI腳本提供一個調(diào)試特性,而不是要在運(yùn)行服務(wù)時持續(xù)保持活動狀態(tài)。它沒有為速度或是效率作優(yōu)化,而且與專門設(shè)計的那些特性不同,在某種程度上它會存在安全問題。
說明 | 記入日志文件的PUT或POST請求頭的最大數(shù)量 |
---|---|
語法 | ScriptLogBuffer bytes |
默認(rèn)值 | ScriptLogBuffer 1024 |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_cgi , mod_cgid |
限制記入日志文件的PUT或者POST內(nèi)容的大小,防止如果接收到很大內(nèi)容時日志文件的尺寸增加得太快太大。默認(rèn)地,最多紀(jì)錄1024字節(jié),但這個數(shù)字可以用此指令改變。
說明 | 日志文件的大小限制(字節(jié)) |
---|---|
語法 | ScriptLogLength bytes |
默認(rèn)值 | ScriptLogLength 10385760 |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_cgi , mod_cgid |
ScriptLogLength
指令可以用于限制CGI腳本文件的大小。由于日志文件對每個CGI錯誤紀(jì)錄(所有請求頭、所有腳本輸出)許多信息,它有可能會變成一個很大的文件。為了防止無限制的增長引起的問題,這個指令可以用來給CGI日志文件的大小設(shè)置一個上限。如果文件大小達(dá)到了這個限制,就不會再有信息被寫入日志。