CGI简介

始的HTML語言是設計用來展現靜態的資料,它讓人使用一種簡單的語法展現出豐富的多媒體資料,就像廣告看板一樣。 由於WWW具有相當大的商業用途,因此推出後大受歡迎。可是單純的靜態展示好像缺少了什麼? 如果使用者需要的資料具有時效性,必需時常更新,這時該怎麼辦呢? 又或者你想留下使用者的資料,讓你的網頁能跟使用者達到互動的效果,這時又該如何? 由於上述種種需求,於是就誕生了CGI這東東。 

CGI是Common Gateway Interface的縮寫,中文翻做『共通閘道介面』。它是一種標準介面程式,能讓你的網頁跟WWW server溝通,達到跟使用者互動的效果。 而且透過CGI程式,可以讓你動態的產生網頁,秀出server上的最新資料。當你link到一個CGI物件時,你取回的文件並非是一份靜態資料, 而是一個藉由程式動態產生的HTML資料流。傳回來的資料也許分分秒秒都在更改,或者針對使用者的特殊查詢而有不同的反應,例如股票市場行情等等。 簡單來說,CGI程式就是能夠動態產生WWW網頁,並讓一般使用者經由WWW取用現存在傳統資訊系統內的資料。 


先,你得認清一個事實:如果資料是天天更新,你絕對不可能寫一個很大的HTML文件包含所有的這些更新資料。 萬一放在WWW上的資料是分分秒秒都在變動的,那麼利用程式自動根據資料產生HTML文件顯然是你唯一的選擇。 第二,CGI程式可以根據使用者輸入的要求自動產生HTML格式的資料。因為輸入資料是由WWW server負責接收,並非CGI程式本身, 故得找出一個有效率的方法,來做使用者輸入參數和產生HTML文件程式間的溝通工作。 CGI本身制訂的標準有提到可以藉由環境變數來達成這個目的,而且CGI程式也有能力取得現存在各類資料庫裡的資料。 這就是為什麼我們稱之為Common Gateway Interface,因為CGI程式通常就像橋樑或閘道一般,溝通著非WWW系統和WWW server (這和下面所說的Web server、HTTP server是一樣的,都是指一個架有HTTPd的伺服器)。

個例子來說,你是某家證券公司的大老闆,你的公司裡已經有一個相當完善的資料庫,裝滿了過去所有的股票價格資料, 現在你想經由WWW提供這些資料給你的顧客們做參考,但是你的資料庫系統根本就不懂HTTP這種格式,這時你就需要一個閘道程式, 當作股票價格資料庫和HTTP server間的橋樑通道,於是CGI程式就誕生了。它可以取得HTTP使用者送來的查詢指令,轉換成現存資料庫可以了解的指令, 用以取得資料後,再將資料轉換為HTML格式,最後再經由HTTP server傳回給使用者,秀在使用者的瀏覽器上。

據上述這些要求,CGI程式的確可以用任何程式語言來撰寫,只要該語言具有讀寫檔案的能力且該資料檔可被存取即可。 不過這也表示寫程式時需要注意安全性的問題,以免資料被使用者有意無意的破壞,否則到時候就真的欲哭無淚了。 

下來我要說一些比較理論性的東西,但卻是寫CGI程式必備的基本知識。一部Web server上一定會跑起HTTPd,這是HTTP的server程式(daemon)。 由於HTTPd牽涉到系統設定問題,所以除非你是系統管理者或是自己架一台server跑起HTTPd,否則一般使用者是沒有權跑自己寫的CGI程式的。 不過現在另外有個程式叫CGI wrap,它可以透過一種特殊的方法讀取userhome/www/cgi-bin裡的CGI程式,並且以使用者的身份來執行這個CGI程式,所以不虞有被破站的危險。 ind.ntou.edu.tw這部Email and Web server就有裝上CGIwrap,並且全校師生都有帳號,是大家練習CGI程式的好去處(相關的使用方法請Email to root@ind.ntou.edu.tw)。

OK! 現在我們假設你的Web server已經設置好執行CGI的環境,並且你有存取cgi-bin目錄的權限 (至於HTTPd和TCPwrap的安裝與相關設定並不在本篇文章的討論範圍內,有興趣者請自行到各大bbs站相關佈告欄的精華區找找,一定可以找到你所需要的答案)。 當使用者用瀏覽器link到一個CGI程式時,瀏覽器會透過HTTP這個通訊協定,送出一個請求(require)給遠端(remote)的Web server,Web server就會跑一個HTTPd process, 這個process會去找指定的目錄下有沒有這個CGI程式,如果有的話HTTPd會啟動一個child process來跑這個CGI程式,也因此繼承了HTTPd所有的環境變數設定。 這也就是說使用者所輸入的要求會經由HTTP通訊協定傳送到Web server的HTTPd,再經由環境變數或標準輸入裝置(STDIN)傳遞給CGI程式。CGI程式相關的環境變數列表於下: 

Environment VariableDescription
SERVER_SOFTWAREThe type of Web server running the CGI program
SERVER_NAMEThe name of the Web server host
SERVER_PORTThe port address of the Web server
GATEWAY_INTERFACThe version number of the CGI standard
SERVER_PROTOCOLThe version of HTTP the server is running
REQUEST_METHODThe method of requesting data specified by the client
QUERY_STRINGRequest parameters supplied by the client
SCRIPT_NAMEThe resource locator of the CGI program
REMOTE_HOSTThe name of the client host
REMOTE_ADDRThe Ipaddress if the client host
AUTH_TYPEAuthorization method,often blank
REMOTE_USERThe name of the user provided by the client
REMOTE_IDENTAn identify fot the client user,not often available
REFERER_URLHow the client got here
HTTP_ACCEPTThe MIME types accepted by the client
HTTP_USER_AGENTThe client browser type
CONTENT_TYPEThe MIME type of data supplied with the request

CGI程式接收到使用者的需求,經過一番處理,然後會將標準輸出(執行結果)傳送給HTTPd,再經由HTTP交給客戶端(client)的瀏覽器秀出來。 所以CGI程式在標準輸出上的執行結果必須要符合HTML格式,而在文件的排版方面當然也要依HTML格式來寫,這一點要特別注意一下。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析——pyecharts

导入类库 1 from pyecharts import Pie, Bar, Gauge, EffectScatter, WordCloud, Map, Grid, Line, Timeline 2 import random make_point:标注,类似于matplotlib的text is_stack:堆叠,将同一图表中的不同图像堆叠显示 is_label_s…

第三方软件要使用QQ邮箱进行发邮件相关设置

1、要在QQ邮箱的设置界面进行相关设置。 开启相应的服务器,然后获得相应的授权密码即可。 相关参考: http://service.mail.qq.com/cgi-bin/help?subtype1&&id28&&no1001256 2、对相应的服务器和接口进行设置 相关参考:…

CGI相关介绍

一、CGI 简介CGI 是 Common Gateway Interface 的 简 称 。 其 主 要 的 功 能 是 在WWW 环 境 下 , 藉 由 从 客 户 端 传 递 一 些 讯 息 给 WWW Server , 再由 WWW Server 去 启 动 所 指 定 的 程 式 码 来 完 成 特 定 的 工 作 。所 以 更 明 确 的…

mapreduce 聚合_MapReduce:处理数据密集型文本处理–局部聚合第二部分

mapreduce 聚合这篇文章继续进行有关使用MapReduce进行数据密集型处理的书中实现算法的系列文章。 第一部分可以在这里找到。 在上一篇文章中,我们讨论了使用本地聚合技术来减少通过网络进行混洗和传输的数据量的方法。 减少传输的数据量是提高MapReduce作业效率的主…

最常出现的字符串 Most Common Word

2018-10-26 00:32:05 问题描述: 问题求解: 方法一、Trie 最长出现的字符串,最容易想到的解法就是Trie树了,于是首先使用Trie树进行了实现,代码量有点大,当然了是可以A掉的,只是对于这种Easy的题…

docker启动odoo提示module没有安装_Ubuntu20.04通过docker安装微信

到目前为止,在ubuntu20.04上使用wechat最简单的方式不是wine,而是用docker。今天就传授大家一个一定可以使用的docker安装的wine版本。首先,安装一下docker:sudo apt install docker.io sudo systemctl enable --now dockersudo s…

mysql如何在一个表中插入数据的同时,更新另一个表的数据?

三种方案,你看看哪个比较适合你1,适用于学生: 写两个方法,一个新增一个更新,在新增完了以后马上去查询一下,按主键倒叙排列,取到最新插入的id,前提主键是自增的且不是uuid,然后把查到的主键返回出去作为形参让更新方法接收到,然后更新即可.2,适用于ssh框架: 写两个事务,事务的传…

Python Web初学解惑之 WSGI、flup、fastcgi、web.py的关系

首先声明这篇文章 是我从 豆瓣 上面看到的。 原文地址 http://www.douban.com/note/13508388/?start0&postok#last 看我之后 豁然开朗,对Web的理解有加深了一层,在此再感谢一下文章的作者。写这篇文章 :一 写下 自己的理解&#xff1…

继承Javadoc方法注释

尽管用于javadoc工具的JDK工具和实用程序页面通过实现和继承方法来描述Javadoc方法注释重用的规则,但是当实际上不需要使用{inheritDoc}时,很容易不必要地显式描述注释继承,因为会使用相同的注释隐式继承。 Java 8 javadoc工具页面在“ 方法公…

C++之手写strlen函数

代码: int strlen(const char *str){ assert(str!NULL); intlen0; while((*str)!\0) len;return len; } 这个函数实现起来较为简单,注意字符指针的有效性检查。 可参考:strlen、strcpy、strcat等字符串处理函数的实现 转载于:https://www.cnb…

mysql or优化_MySQL 语句优化

官方文档放这里,有什么代码先到官方文档查询:MySQL 8.0 Reference Manual :: 8 Optimization​dev.mysql.com优化涉及多个级别的配置,调整和测量性能。 根据工作角色(开发人员,DBA或两者的组合)&#xff0c…

浅谈 MySQL 的存储引擎(表类型)

什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合。 我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据&#…

Ubuntu如何搭建Django与Flup和Nginx环境?

Ubuntu系统越来越多的用户开始使用,本文介绍的是搭建DjangoFlupNginx环境的过程。 首先我们必须明白这这3者在该环境下发挥的作用。 1.nginx:("enginex")是一个高性能的HTTP和反向代理服务器,作用和apache的类似。它可以处理一些静…

洛谷 1137 旅行计划

【题解】 拓扑排序DP即可。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<vector>5 #define LL long long6 #define rg register7 #define N 2000108 using namespace std;9 int n,m,front,rear,q[N],f[N],in[N]; 10 bool v…

NOT IN、JOIN、IS NULL、NOT EXISTS效率对比

语句一&#xff1a;select count(*) from A where A.a not in (select a from B) 语句二&#xff1a;select count(*) from A left join B on A.a B.a where B.a is null 语句三&#xff1a;select count(*) from A where not exists (select a from B where A.a B.a) 知道以…

python ssl_Python3 ssl模块不可用的问题

编译安装完Python3之后&#xff0c;使用pip来安装python库&#xff0c;发现了如下报错&#xff1a; $ pip install numpy pipis configured with locations that require TLS/SSL, however the ssl module in Python isnot available. Collecting numpy Retrying (Retry(total4…

shell脚本 如何切换当前目录

问题&#xff1a; 是这么个情况&#xff1a;当前目录是/root/replace/ 我想在脚本a.sh中执行该目录下的一个子目录/root/replace/scripts/下的可执行文件run.out和b.sh脚本。但是这个可执行文件run.out的文件读写要求在/scripts下&#xff0c;而b.sh脚本则是以/scripts为当前目…

使用DynamoDBMapper扫描DynamoDB项目

之前&#xff0c;我们介绍了如何使用DynamoDBMapper或底层Java api查询DynamoDB数据库。 除了发出查询之外&#xff0c;DynamoDB还提供扫描功能。 扫描的目的是获取您在DynamoDB表上可能拥有的所有项目。 因此&#xff0c;扫描不需要任何基于我们的分区键或您的全局/本地二级…

vs python生成exe文件_使用VScode编写python程序并打包成.exe文件-文件夹变成exe

1. 下载vscode并安装 2. 配置Python环境 点击左下角的吃了图标&#xff0c;在弹出的菜单中选择extensions&#xff0c;在左上方搜索框内输入“Python”&#xff0c;可以看到好多Python插件&#xff0c;选择安装喜欢的Python插件&#xff08;配图两张&#xff09;。安装Python插…

如何清除主板CMOS

最近很多网友反映&#xff0c;对于清除主板CMOS&#xff0c;不是很了解&#xff0c;操作上也不明白&#xff0c;因此网站重新制作主板CMOS清除的过程&#xff0c;并以图文的形式制作&#xff0c;以便更加直观清楚。 CMOS(本意是指互补金属氧化物半导体存储嚣&#xff0c;是一…