# Apache模塊 mod_cgi
| [說明](#calibre_link-11) | 在非線程型MPM(`prefork`)上提供對CGI腳本執行的支持 |
| --- | --- |
| [狀態](#calibre_link-12) | 基本(B) |
| [模塊名](#calibre_link-13) | cgi_module |
| [源文件](#calibre_link-14) | mod_cgi.c |
### 概述
任何具有MIME類型`application/x-httpd-cgi`或者被`cgi-script`處理器處理的文件都將被作為CGI腳本對待并由服務器運行,它的輸出將被返回給客戶端。可以通過兩種途徑使文件成為CGI腳本,一種是文件具有已由`AddType`指令定義的擴展名,另一種是文件位于`ScriptAlias`目錄中。
當服務器調用一個CGI腳本時會往運行環境中添加一個叫做`DOCUMENT_ROOT`的變量。這個變量將包含`DocumentRoot`指令的值。
要得到對Apache中使用CGI腳本的介紹,參看[使用CGI產生動態內容](#calibre_link-215)。
在UNIX下使用多線程型的MPM時,應該使用模塊`mod_cgid`代替本模塊。在用戶層面,這兩個模塊本質上是相同的。
## CGI環境變量
Apache將按照[CGI規范](http://hoohoo.ncsa.uiuc.edu/cgi/)設置環境變量,有以下幾個:
PATH_INFO
如果顯式設置了`AcceptPathInfo`指令為 `off` ,這個變量將不可用。如果沒有明確設置`AcceptPathInfo` ,默認的行為是`mod_cgi`將會接受路徑信息(URI里腳本文件名之后的`/more/path/info`),即使服務器核心對請求的附加路徑信息返回"404 NOT FOUND"錯誤。省略`AcceptPathInfo`指令與將它設置為 `On` 對`mod_cgi`請求具有相同的效果。
REMOTE_HOST
這個變量只有在`HostnameLookups`指令被設置為"`on`"(默認是"off")并且對訪問主機的DNS反查確實找到了主機名時才被設置。
REMOTE_IDENT
這個變量只有在`IdentityCheck`被設置為 `on` 并且訪問主機支持識別協議時才被設置。注意這個變量不能信賴,因為它很容易被假冒。而且如果客戶端與服務器之間存在代理的話,這個變量通常完全沒有用處。
REMOTE_USER
這個變量只有當CGI腳本需要身份驗證時才被設置。
## CGI腳本的調試
調試CGI腳本一直以來都很困難,主要是因為在腳本不能正確運行時不可能研究它的輸出(stdout和stderr)。這些指令為發生錯誤時提供了更詳細的錯誤日志。
### CGI日志文件格式
配置好以后,CGI錯誤日志會記錄任何沒有正確運行的CGI。每個運行失敗的CGI腳本都有幾行信息被記錄。頭兩行總是這樣的格式:
```
%% [<var class="calibre40">time</var>] <var class="calibre40">request-line</var>
%% <var class="calibre40">HTTP-status</var> <var class="calibre40">CGI-script-filename</var>
```
如果錯誤是CGI腳本無法執行,日志文件會包含以下額外的兩行:
```
%%error
<var class="calibre40">error-message</var>
```
或者,如果錯誤是腳本執行結果返回了不正確的頭信息(經常是由于腳本內部的bug),會記錄以下兩行:
```
%request
<var class="calibre40">All HTTP request headers received</var>
<var class="calibre40">POST or PUT entity (if any)</var>
%response
<var class="calibre40">All headers output by the CGI script</var>
%stdout
<var class="calibre40">CGI standard output</var>
%stderr
<var class="calibre40">CGI standard error</var>
```
如果腳本沒有在stdout和stderr上輸出可能會沒有%stdout和%stderr部分。
## ScriptLog 指令
| [說明](#calibre_link-18) | CGI腳本錯誤日志文件的位置 |
| --- | --- |
| [語法](#calibre_link-19) | `ScriptLog file-path` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [狀態](#calibre_link-21) | 基本(B) |
| [模塊](#calibre_link-22) | `mod_cgi`, `mod_cgid` |
`ScriptLog`指令設置了CGI腳本錯誤日志文件的位置。如果沒有設置`ScriptLog` ,就不會創建錯誤日志。如果設置了,所有CGI錯誤都會被記入作為指令參數的文件中。如果是一個相對路徑則以`ServerRoot`為參照。
### 示例
```
ScriptLog logs/cgi_log
```
此日志會以運行子進程的用戶身份打開,比如由主服務器配置部分的`User`指令指定的用戶。這意味著,或者該用戶對腳本日志所在目錄具有寫權限,或者日志文件由此用戶手工創建并設置為可寫。如果你把腳本日志放在你的主日志目錄中,**不要**為了讓運行子進程的用戶可以寫日志而改變目錄的權限。
注意,腳本日志是為了給創建CGI腳本提供一個調試特性,而不是要在運行服務時持續保持活動狀態。它沒有為速度或是效率作優化,而且與專門設計的那些特性不同,在某種程度上它會存在安全問題。
## ScriptLogBuffer 指令
| [說明](#calibre_link-18) | 記入日志文件的PUT或POST請求頭的最大數量 |
| --- | --- |
| [語法](#calibre_link-19) | `ScriptLogBuffer bytes` |
| [默認值](#calibre_link-24) | `ScriptLogBuffer 1024` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [狀態](#calibre_link-21) | 基本(B) |
| [模塊](#calibre_link-22) | `mod_cgi`, `mod_cgid` |
限制記入日志文件的PUT或者POST內容的大小,防止如果接收到很大內容時日志文件的尺寸增加得太快太大。默認地,最多紀錄1024字節,但這個數字可以用此指令改變。
## ScriptLogLength 指令
| [說明](#calibre_link-18) | 日志文件的大小限制(字節) |
| --- | --- |
| [語法](#calibre_link-19) | `ScriptLogLength bytes` |
| [默認值](#calibre_link-24) | `ScriptLogLength 10385760` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [狀態](#calibre_link-21) | 基本(B) |
| [模塊](#calibre_link-22) | `mod_cgi`, `mod_cgid` |
`ScriptLogLength`指令可以用于限制CGI腳本文件的大小。由于日志文件對每個CGI錯誤紀錄(所有請求頭、所有腳本輸出)許多信息,它有可能會變成一個很大的文件。為了防止無限制的增長引起的問題,這個指令可以用來給CGI日志文件的大小設置一個上限。如果文件大小達到了這個限制,就不會再有信息被寫入日志。
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航