CGI 相关知识

总是在程序中遇到cgi.server_name

                        cgi.script_name

            然后就好奇什么是cgi,后来发现这些都是cgi在客户向web服务器post,get时候所请求的参数。

           具体呢提供下面内容参考

http://www.wangchao.net.cn/bbsdetail_21148.html

 

 

用Delphi编写CGI程序(一)
  
  1.0 、 CGI 程 序 的 功 能:
   首 先, 什 么 是 公 共 网 关 接 口( CGI ) 呢? CGI 是 一 个 用 于 定 义 WEB 服 务 器 与 外 部 程 序 之 间 通 信 方 式 的 标 准, 使 得 外 部 程 序 能 生 成 HTML 、 图 象 或 者 其 他 内 容, 而 服 务 器 处 理 的 方 式 与 那 些 非 外 部 程 序 生 成 的 HTML 、 图 象 或 者 其 他 内 容 的 处 理 方 式 是 相 同 的。 因 此, CGI 程 序 不 仅 使 你 能 生 成 静 态 内 容, 而 且 能 生 成 动 态 内 容。 使 用 CGI 的 原 因 在 于 它 是 一 个 定 义 良 好 并 被 广 泛 支 持 的 标 准。 虽 然, Java 、 ActiveX 等 可 以 完 成 CGI 程 序 的 功 能, 但 并 不 是 所 有 浏 览 器 都 支 持 它 们。 相 反, 所 有 浏 览 器 都 支 持 CGI , 如: Lynx 、 IE 、 Netscape 等。
   然 而, 和 其 他 技 术 一 样, CGI 也 有 它 的 局 限 性。 本 节 我 就 讲 述 CGI 程 序 的 功 能、 优 点 与 不 足。
  1.1 、 CGI 功 能
   有 许 多 任 务, CGI 是 最 佳 的 是 唯 一 的 选 择, 这 些 任 务 可 分 为 三 类: 初 级 任 务、 中 级 任 务 和 高 级 任 务。 初 级 任 务 是 一 些 不 用 怎 么 编 程 的 任 务, 如:
  文 本 型 计 数 器
  生 成 简 单 的 HTML 的 程 序
  少 于 50 行 用 Perl 语 言、 Shell 脚 本、 C 语 言 或 C++ 语 言 编 写 的 程 序
   这 样 的 任 务 用 CGI 来 写 至 少 有 三 点 好 处: 第 一、 CGI 运 行 最 快, 而 Java 等 开 销 太 大; 第 二、 CGI 标 准 于 当 前 浏 览 器 最 兼 容, 这 一 点 在 前 面 已 经 提 到; 第 三、 CGI 资 源 丰 富, 您 在 Internet 上 可 以 找 到 成 千 上 万 的 CGI 代 码。
   中 级 任 务 是 包 括 图 象 映 象 和 其 他 一 些 稍 复 杂 的 程 序 设 计 任 务。 在 中 级 任 务 中, 用 CGI 和 Java 来 编 写 程 序 的 难 易 程 度 差 别 不 大。
   此 类 任 务 包 括:
  图 象 映 象
  生 成 整 页 的 HTML 的 CGI 脚 本
  动 画
   很 有 特 点 的 是, 对 于 高 级 任 务, 用 CGI 比 用 Java 编 程 要 简 单 得 多。 此 类 任 务 有:
  后 端 数 据 库 操 作
  搜 索 引 擎
  多 重 动 态 页 面
   其 中, 后 端 数 据 库 操 作( 存 取 数 据 库 的 应 用 程 序) 体 现 了 CGI 的 优 越 性。 CGI 有 一 定 的 历 史, 其 中 很 多 有 用 的 功 能 都 在 CGI 的 库 中 由 别 人 做 好 了; 同 时, 许 多 大 公 司 提 供 了 用 CGI 作好的源代码。 Java 是 一 种 程 序 设 计 语 言, 而 CGI 是 网 关 程 序 的 功 能 规 范。 如 果 Java 有 较 大 改 变, 您 得 重 写 整 个 程 序; 而 CGI 有 较 大 变 化 的, 您 只 要 升 级 CGI 库 程 序 即 可。
   然 而, CGI 在 有 些 方 面 还 是 有 局 限 性 的。
  1.2 、 CGI 的 局 限 性
   在 图 象 映 象 和 动 画 方 面, CGI 程 序 不 如 Java 程 序 开 发 方 便。 现 在 Java 越 来 越 流 行, CGI 程 序 则 越 来 越 适 合 编 写 简 短 杂 乱 的 程 序 和 数 据 库 应 用 程 序。
  1.3 、 CGI 程 序 功 能
   CGI 程 序 的 最 大 特 点 是 可 以 用 任 何 一 种 语 言 编 制, 可 运 行 在 任 何 一 种 平 台 上, 只 要 它 符 合 CGI 的 规 范 即 可。 下 表 是 一 个 比 较:
  任 务CGI+HTMLHTML
  处 理 表 单 Yes No
  创 建 WEB 页 面 上 非 静 态 内 容 Yes No
  处 理 图 象 映 象 文 件 Yes Yes
  在 WEB 页 面 和 文 档 中 搜 索Yes No
  创 建 表 单 Yes Yes
  创 建 平 台 无 关 的 文 档Yes Yes
  创 建 聊 天 室 等 交 互 应 用 程 序 Yes No
  页 面 动 态 生 成 Yes No
  按 用 户 需 要 进 行 页 面 文 档 裁 剪Yes No
   下 面, 我 们 用 一 系 列“ Hello World ” 程 序 结 束 本 讲:
  Perl :
  Require "cgi-lib.pl";
  print &PrintHeader;
  print "/n";
  print "Hello World/n";
  print &PrintEnv;
  exit;
   此 文 件 存 储 在 C:/HTTPD/CGI-BIN 目 录 下, 文 件 名 为 2_1.pl 。 在 浏 览 器 中 用 地 址 http://localhost/cgi-bin/2_1.pl 调 用。 注 意, 此 时 OmniHTTPD 应 在 运 行。 如 果 一 切 正 常, 您 可 以 在 浏 览 器 中 看 见“ Hello World ” 和 环 境 变 量。
  C : #include
  #include "html-lib.h"
  #include "cgi-lib.h"
  int main()
  {
   html_header();
   html_begin("Test CGI");
   h1("CGI Program");
   printf("/n");
   h2("CGI Environment Variables");
   print_cgi_env();
   html_end();
   return 0; }
   编 译 后 将 可 执 行 文 件 复 制 到 C:/HTTPD/CGI-BIN 下, 改 名 为 2_1.cgi , 用 地 址 http://localhost/cgi-bin/2_1.cgi 调 用。

 

 

 

<script></script>

 用Delphi编写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 : 服 务 器 送 给 客 户 端 的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值