本 讲 的 内 容 是 深 入 了 解 CGI 程 序 的 基 础。
在 上 一 讲 中, 我 们 介 绍 了 CGI 程 序 的 功 能。 今 天, 我 们 进 入: 第 二 部 分、 CGI 程 序 设 计 的 概 念 。本 讲 的 内 容 是 深 入 了 解 CGI 程 序 的 基 础。
本 系 列 讲 座 是 用 Delphi 编 写 CGI 程 序, 对 于 本 次 的 内 容 Delphi 已 经 封 装 在 它 的 类 中, 您 也 许 认 为 本 讲 没 有 必 要。 但 我 认 为 CGI 的 优 势 之 一 是 可 用 的 开 发 语 言 多( 下 面 将 提 到 这 个 问 题), 而 本 讲 的 内 容 可 用 于 任 何 程 序 设 计 语 言 中( 包 括 Delphi )。 所 以, 要 发 挥 CGI 的 优 势, 本 讲 的 内 容 还 是 必 要 的; 再 说, 本 讲 的 内 容 是 深 入 了 解 CGI 程 序 的 基 础。
2 、 CGI 规 范:
通 常, WEB 服 务 器 是 一 台 功 能 强 大 的 计 算 机, 但 不 可 能 利 用 所 有 处 理 能 力。 CGI 的 产 生 使 得 人 们 可 以 用 WEB 服 务 器 的 处 理 能 力 为 远 程 客 户 提 供 有 趣 的、 动 态 的 内 容。 CGI 规 范 应 用 于 WEB 服 务 器 及 运 行 在 WEB 上 的 应 用 程 序。 它 不 是 HTTP 协 议 的 一 部 分, 但 大 多 数 WEB 服 务 器 都 支 持 这 个 规 范, 如 NCSA httpd 、 CERN httpd 、 Apache httpd 、 IIS 及 我 们 使 用 的 OmniHTTPD 。
2.1 、 CGI 概 览
CGI 定 义 WEB 服 务 器、 浏 览 器 和 应 用 程 序 之 间 的 相 互 操 作 中 共 同 遵 守 的 规 则 集。 例 如 通 过 WEB 浏 览 器 查 询 远 程 数 据 库 系 统:
2.2 、 语 言:
CGI 程 序 可 以 使 用 WEB 服 务 器 上 可 以 执 行 的 任 何 语 言 来 编 写。 您 应 该 选 用 最 熟 悉 和 最 适 合 目 前 工 作 的 语 言。 如: Perl 语 言 适 合 字 符 串 和 文 件 处 理, C 对 大 型 的、 复 杂 的 程 序 更 合 适, Visual Basic 和 Delphi 则 适 合 数 据 库 的 处 理, 等 等。 下 面 是 常 用 的 CGI 编 程 语 言:
C
C++
Perl
Tcl
Python
Shell Scripts
Visual Basic
Delphi
Applescript
2.3 、 CGI 方 法:
调 用 CGI 的 途 径 称 为 CGI 方 法。 主 要 有 三 种 CGI 方 法:
2.3.1 、 GET 方 法:
GET 方 法 是 浏 览 器 向 WEB 服 务 器 提 出 请 求 的 方 法。 使 用 这 种 方 法 时, CGI 程 序 从 环 境 变 量 QUERY_STRING 中 获 取 数 据。 CGI 程 序 为 了 得 到 输 入 的 参 数, 必 须 分 析 这 个 环 境 变 量。 当 传 输 的 数 据 很 长 时, 应 使 用 POST 方 法。
2.3.2 、 POST 方 法:
使 用 POST 方 法 时, CGI 程 序 从 stdin ( 标 准 输 入) 得 到 输 入 数 据。 由 于 输 入 数 据 的 最 后 没 有 EOF ( 文 件 结 束 标 志 End Of File ), CGI 程 序 为 了 正 确 读 取 输 入 数 据, 必 须 使 用 环 境 变 量 CONTENT_LENGTH 值。 用 这 种 方 法 的 最 大 优 点 在 于 可 以 传 输 大 量 数 据, 而 GET 方 法 由 于 受 URL 长 度 的 限 制( 一 般 不 超 过 1024 字 节), 无 法 传 输 大 量 数 据。 这 时, POST 方 法 是 唯 一 的 选 择。
2.3.3 、 HEAD 方 法:
HEAD 方 法 基 本 同 于 GET 方 法, 只 是 它 是 从 WEB 服 务 器 向 浏 览 器 传 输 数 据。 而 且, 传 输 的 仅 仅 是 HTTP 的 头 信 息。
2.4 、 接 口 规 范:
下 面 将 介 绍 WEB 服 务 器 与 CGI 程 序 通 信 的 四 种 主 要 方 法: 环 境 变 量、 命 令 行、 标 准 输 入 和 标 准 输 出。( 根 据 CGI Version 1.1 给 出)
2.4.1 、 环 境 变 量:
AUTH_TYPE : 如 果 服 务 器 支 持 确 认 并 且 脚 本 得 到 保 护, 给 出 确 认 的 类 型。
CONTENT_LENGTH : 给 出 以 字 节 为 单 位 的 用 POST 方 法 传 输 的 数 据 长 度。 用 GET 方 法 时 变 量 为 空。
CONTENT_TYPE : 给 出 用 POST 方 法 时 传 输 数 据 的 MINE 类 型。 当 使 用 GET 方 法 时 变 量 为 空。 如: application/x-www-form-urlencoded 。
GETWAY_INTERFACE : 给 出 CGI 规 范 名 和 版 本 号, 如: CGI/1.1 。
PATH_INFO : 给 出 了 URL 中 CGI 程 序 名 之 后 的 附 加 路 径 信 息。
PATH_TRANSLATED : CGI 程 序 的 物 理 路 径, 通 常 是 WEB 根 目 录、 脚 本 名 和 附 加 路 径 信 息。
QUERY_STRING : URL 中 " ? " 字 符 后 的 信 息。 使 用 GET 方 法 时 此 环 境 变 量 给 出 输 入 数 据。
REMOTE_ADDR : 提 出 请 求 的 远 程 计 算 机 的 IP 。
REMOTE_HOST : 提 出 请 求 的 远 程 计 算 机 的 名 字。
REMOTE_IDENT : 给 出 RFC 931 中 定 义 的 用 户 名。
注: RFC 931 是 Internet 的 权 威 文 档, 描 述 了 确 认 TCP 连 接 中 识 别 用 户 的 方 法。 文 档 在: http://sunsite.auc.dk/RFC/rfc/rfc931.html 。
REMOTE_USER : 给 出 提 出 请 求 的 客 户 端 的 授 权 用 户 名。
REQUEST_METHOD : 提 出 请 求 的 方 法, 可 以 是 GET 、 HEAD 和 POST 。
SCRIPT_NAME : 要 执 行 CGI 程 序 的 虚 拟 路 径, 如: /cgi-bin/query.cgi 。
SERVER_NAME : 运 行 WEB 服 务 器 软 件 的 计 算 机 域 名 或 IP 地 址, 如: www.chinabyte.com 。
SERVER_PORT : WEB 服 务 器 的 端 口 号, 缺 省 值 是 80 。
SERVER_PROTOCOL : WEB 服 务 器 使 用 的 协 议 名 和 版 本 号, 如: HTTPD/1.0 。
SERVER_SOFTWARE : 执 行 CGI 程 序 的 WEB 服 务 器 名。 格 式 为 " 服 务 器 名 / 版 本 号 " , 如: NCSA/1.5b5 。
HTTP_ACCEPT : 客 户 端 发 送 的 "Accpect : 标 题 行 " , 对 应 于 客 户 端 能 处 理 的 MIME 类 型, 格 式 为 " 类 型 / 子 类 型, 类 型 / 子 类 型 等 " , 如: */* , image/gif , image/jpeg 。
HTTP_REFERER : 是 Referer : 标 题 行 的 目 录, 包 含 了 CGI 请 求 时 的 表 单( Form ) 的 URL , 如: http://www.chinabyte.com/register.form 。
HTTP_USER_AGENT : 提 出 请 求 的 客 户 端 浏 览 器 名, 如: Mozilla/1.2N ( Windows;I;32bit )。
以 上 的 这 些 环 境 变 量 您 可 以 用 上 一 讲 的 示 范 程 序 看 到。
2.4.2 、 命 令 行:
CGI 命 令 行 只 在 用 ISINDEX 查 询 时 才 用 到。 ISINDEX 查 询 是 包 含 在 < ISINDEX> 和 < BASE HREP=".."> 之 间 的 特 殊 查 询。 命 令 行 可 以 带 多 个 参 数。
2.4.3 、 标 准 输 入:
使 用 POST 方 法 时, CGI 程 序 从 stdin 得 到 传 输 数 据。 前 面 讲 过, 必 须 使 用 CONTENT_TYPE 和 CONTENT_LENGTH 环 境 变 量 值。 其 中 要 注 意 的 是, 数 据 中 的 URL 被 编 码 了, 如 空 格 用 加 号 代 替、 ~ 由 %7E 代 替 等。
2.4.4 、 标 准 输 出:
CGI 程 序 通 过 标 准 输 出 将 数 据 送 给 浏 览 器, 或 是 WEB 服 务 器 可 解 释 的 命 令。 CGI 程 序 可 以 通 过 WEB 服 务 器 同 浏 览 器 对 话, 它 们 的 程 序 名 必 须 以 "nph-" 开 头, 代 表 未 经 分 析 的 头 信 息。 CGI 程 序 负 责 返 回 给 浏 览 器 的 HTTP 头 信 息 的 正 确 性。
在 不 使 用 nph- 程 序 时, 服 务 器 查 找 CGI 可 能 返 回 的 三 种 特 殊 的 头 信 息:
Content-type : MIME 类 型 的 头 信 息, 如: 输 入 HTML 时, 常 用 "Content-type:text/html\n\n" 。
Location : 告 知 服 务 器 你 正 指 向 别 的 文 档。 服 务 器 或 者 重 定 向 客 户, 或 者 发 送 文 档 内 容, 这 取 决 于 URL 是 完 整 路 径 还 是 相 对 路 径。
Status : 服 务 器 送 给 客 户 端 的 状 态 行。 格 式 为: nnnXXXXX , nnn 是 一 个 三 位 数 编 码, 而 XXXXX 是 相 对 应 的 描 述 文 本。