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 調 用。

 

 

 

 用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 : 服 務 器 送 給 客 戶 端 的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章