apache/C++ CGI动态页面 http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html

PHP-FPM、FastCGI和PHP-CGI的用途及示例代码 PHP-FPM、FastCGI和PHP-CGI是与PHP相关的技术,用于处理动态网页内容。本文将详细介绍PHP-FPM绍PHP-FPM、FastCGI和PHP-CGI的用途,并提供一些示例代码来说明它们的工作原理。综上所述,PHP-FPM、FastCGI和PHP-CGI是用于处理动态网页内容的技术。它们通过将PHP解释器作为独立进程运行,并使用FastCGI协议与Web服务器进行通信,提高了PHP脚本的性能和可伸缩性。通过适当的配置和使用示例代码,可以将这些技术应用于实际的Web开发项目中。 阅读详情

CGI动态页面

top

简介

CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。本文将对如何在Apache web服务器上建立CGI以及如何编写CGI程序进行介绍。

top

配置Apache以允许CGI

要让CGI程序能正常运作,必须配置Apache以允许CGI的执行,其方法有多种。

ScriptAlias

ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中所有的文件都是CGI程序并试图运行它。

ScriptAlias指令形如:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

如果Apache被安装到默认位置,默认的配置文件httpd.conf中就会有上述配置。ScriptAliasAlias指令非常相似,都是定义了映射到一个特定目录的URL前缀,两者一般都用于指定位于DocumentRoot以外的目录,其不同之处是ScriptAlias又多了一层含义,即URL前缀后面的任何文件都被视为CGI程序。所以,上述例子会指示Apache:任何以/cgi-bin/开头的资源都将映射到/usr/local/apache2/cgi-bin/目录中,且视之为CGI程序。

例如,如果有URL为http://www.example.com/cgi-bin/test.pl的请求,Apache会试图执行/usr/local/apache2/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则Apache返回一个出错消息。

ScriptAlias目录以外的CGI

由于安全原因,CGI程序通常被限制在ScriptAlias指定的目录中,这样,管理员就可以严格控制谁可以使用CGI程序。但是,如果采取了恰当的安全措施,则没有理由不允许其他目录中的CGI程序运行。比如,你可能希望用户在UserDir指定的宿主目录中存放页面,而他们有自己的CGI程序,但无权访问cgi-bin目录,这样,就产生了运行其他目录中CGI程序的需求。

允许CGI在任意目录执行需要两个步骤:第一步,必须用AddHandlerSetHandler指令激活cgi-script处理器。第二步,必须在Options指令中启用ExecCGI选项。

用Options显式地允许CGI的执行

可以在主配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

<Directory /usr/local/apache2/htdocs/somedir>
Options +ExecCGI
</Directory>

上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgipl后缀的文件是CGI程序:

AddHandler cgi-script .cgi .pl

.htaccess文件

.htaccess指南示范了怎样在没有权限修改httpd.conf文件的情况下激活CGI程序。

用户目录

为了允许用户目录中所有以".cgi"结尾的文件作为CGI程序执行,你可以使用以下配置:

<Directory /home/*/public_html>
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>

如果你想在用户目录中指定一个cgi-bin子目录,其中所有的文件都被当作CGI程序,你可以这样配置:

<Directory /home/*/public_html/cgi-bin>
Options ExecCGI
SetHandler cgi-script
</Directory>

top

编写CGI程序

编写CGI程序和"常规"程序之间有两个主要的不同。

首先,在CGI程序的所有输出前面必须有一个HTTP的MIME类型的头,对客户端指明所接收内容的类型,大多数情况下,像这样:

Content-type: text/html

其次,输出要求是HTML形式的,或者是浏览器可以显示的其他某种形式。多数情况下,输出是HTML形式的,但偶然也会输出一个gif图片或者其他非HTML的内容。

除了这两点,编写CGI程序和编写其他程序大致相同。

第一个CGI程序

这个CGI程序的例子在浏览器中打印一行文字。把下列存为first.pl文件,并放在你的cgi-bin目录中。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

即使不熟悉Perl语言,你也应该能看出它干了什么。第一行,告诉Apache这个文件可以用/usr/bin/perl(或者任何你正在使用的shell)解释并执行。第二行,打印上述要求的内容类型说明,并带有两个换行,在头后面留出空行,以示HTTP头的结束。第三行,打印文字"Hello, World."。程序到此结束。

打开你喜欢的浏览器并输入地址:

http://www.example.com/cgi-bin/first.pl

或者是你存放程序的其他位置,就可以在浏览器窗口中看到一行:Hello, World. 。虽然并不怎么激动人心,但是一旦这个程序能正常运行,那么就可能运行其他任何程序。

top

程序还是不能运行!

使用浏览器从网络访问CGI程序,可能会发生四种情况:

CGI程序的输出
太好了!这说明一切正常。如果输出正常但是浏览器处理出错,请确认你在CGI程序中使用了正确的  Content-Type 。
CGI程序的源代码或者一个"POST Method Not Allowed"消息
这说明Apache没有被正确配置以执行CGI程序,重新阅读 配置Apache看看遗漏了什么。
一个以"Forbidden"开头的消息
这说明有权限问题。参考 Apache错误日志和下面的 文件权限
一个"Internal Server Error"消息
查阅 Apache错误日志,可以找到CGI程序产生的出错消息"Premature end of script headers"。对此,需要检查下列各项,以找出不能产生正确HTTP头的原因。

文件的权限

记住,服务器不是以你的用户身份运行的,在服务器启动后,拥有的是一个非特权用户的权限(通常是nobodywww)而需要更大的权限以允许文件的执行。通常,给予nobody足够的权限以执行文件的方法是,对文件赋予任何人皆可执行的权限:

chmod a+x first.pl

另外,如果需要对其他文件进行读取或写入,也必须对这些文件赋予正确的权限。

路径信息和环境变量

当你在命令行执行一个程序,某些信息会自动传给shell而无须你操心,比如PATH ,告诉shell你所引用的文件可以在哪儿找到。

但是,在CGI程序通过web服务器执行时,则没有此PATH ,所以,你在CGI程序中引用的任何程序(如sendmail)都必须指定其完整的路径,使shell能找到它们以执行你的CGI程序。

一种普通的用法是,在CGI程序的第一行中指明解释器(通常是perl),形如:

#!/usr/bin/perl

必须保证它的确指向解释器。

另外,如果CGI程序依赖于某些环境变量,你要确保所需要的变量已经正确的由Apache进行了传递。

程序错误

多数CGI程序失败的原因在于程序本身有问题,尤其是在已经消除上述两种错误而CGI挂起的情况下。在用浏览器测试以前,先在命令行中执行你的程序,能够发现大多数的问题。比如:

cd /usr/local/apache2/cgi-bin
./first.pl

(不要调用perl解释程序,因为shell和Apache会根据脚本第一行的路径信息找到解释器)

你最先看到的输出内容应当是一组HTTP头,包括Content-Type和结尾的空行。如果你看到了别的什么东西,那么当你在服务器上试运行时,Apache会返回 Premature end of script headers 错误。参见上面的编写CGI程序以获得更多信息。

错误日志

错误日志是你的朋友。任何错误都会在错误日志中有所记载,所以你应该首先查看它。如果你的网站空间提供者不允许访问错误日志,那么你应该考虑换一个空间提供者。学会阅读错误日志,可以快速找出问题并快速解决。

Suexec

suexec允许CGI程序根据其所在虚拟主机或用户宿主目录的不同而以不同的用户权限运行。suexec有极其严格的权限校验,任何校验失败都会使CGI程序遭遇 Premature end of script headers 错误。

为了检查你是否使用了suexec ,运行 apachectl -V 并检查SUEXEC_BIN的位置。如果Apache在启动时发现suexec二进制文件正存在于此,那么suexec将会被激活。

除非你很精通suexec,否则请不要使用它。要禁用它,只要删除(或重命名)SUEXEC_BIN所指定位置的suexec二进制文件并重启服务器就可以了。如果你又想启用它,请首先阅读suexec文档以详细了解其运行机制,然后运行 suexec -V 命令找到suexec日志文件,并使用该日志文件找到你违反了哪条判断规则。

top

幕后是怎样操作的?

当你的CGI编程逐渐深入,理解幕后的操作(尤其是浏览器和服务器之间是如何通讯的)就变得很有用了。因为虽然成功地写了一个程序打印"Hello, World",但并没有实际的用处。

环境变量

环境变量是使用计算机时到处都会用到的变量,比如路径(对实际文件的一个搜索路径以补全你的输入)、你的用户名以及你的终端类型等等。在命令行输入 env ,可以得到当天标准的环境变量列表。

在CGI处理过程中,服务器和浏览器都会设置环境变量,比如浏览器类型(Netscape、IE、Lynx)、服务器类型(Apache、IIS、WebSite)以及将要执行的CGI程序名称等等。

所有这些变量对CGI程序员都有效,但只是客户端-服务器通讯的一半内容。完整的变量列表参见http://hoohoo.ncsa.uiuc.edu/cgi/env.html

这个简单的CGI程序列出了所有的环境变量,Apache发行版的cgi-bin目录中还有一个类似的程序。注意,有些变量是必须的,有些则是可选的,所以你可能会看见一些官方列表中没有的变量。另外,Apache有多种方法可以在默认提供的变量之外增加你的专用环境变量

#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
}

STDIN 和 STDOUT

服务器和客户端之间的其他通讯都通过标准输入设备(STDIN)和标准输出设备(STDOUT)完成。通常,STDIN是指键盘或者一个程序所作用的一个文件,STDOUT指控制台或显示器。

当你POST一个网络表格到一个CGI程序时,表格中的数据被捆扎为一个特殊形式通过STDIN传送给CGI程序,这样,这个程序就可以处理这些数据,仿佛这些数据是来自键盘或者一个文件。

这种"特殊形式"很简单,一个字段名称及其值,中间用等号(=)连接,多个这样的字段对用与符号(&)连接。非常规字符,如空格、"&"号和"="号,被转换为其等值的十六进制以免出问题。整个字符串形如:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

有时,你会发现URL后面也会带有这样的字符串。这种形式会使服务器以这个字符串的内容设置环境变量QUERY_STRING ,称为GET请求。你的HTML表格在FORM标签中设置METHOD属性,以指定传送数据的动作使用GETPOST 。

你的程序必须把这个字符串分解以获得有用信息。所幸,有库和模块可以帮助你处理这些数据,还有为你的CGI程序达成其他目的的处理器。

top

CGI模块/库

编写CGI程序时,你应该考虑使用代码库或模块来完成大多数琐碎的工作,以减少错误并更快地开发。

如果用Perl语言编写CGI程序,可用的模块见CPAN ,最常用的模块是CGI.pm 。也可以考虑用CGI::Lite ,它实现了一个在多数程序中所有必须的最小功能集。

如果用C语言编写CGI程序,则有很多选择,其中之一是CGIC库,来自http://www.boutell.com/cgic/

top

更多信息

网上有大量的CGI资源。可以在Usenet组comp.infosystems.www.authoring.cgi和别人讨论CGI相关问题。HTML Writers Guild 的邮件列表是一个优秀的问题解答资源。更多资源在http://www.hwg.org/lists/hwg-servers/

另外,还可以阅读CGI规范,其中有CGI程序操作的所有细节,原始版本见NCSA ,另有一个更新草案见Common Gateway Interface RFC project

当你向一个邮件列表或者新闻组提交CGI相关问题时,你应该确保提供了足够的信息以更容易地发现并解决问题,诸如:发生了什么事、你希望得到什么结果、结果与你所期望的有什么出入、你运行的服务器、CGI程序是用什么语言编写的、如果可能就提供那个讨厌的代码。

注意,不要把CGI相关问题提交到Apache bug数据库,除非你坚信发现的是Apache源代码中的问题。

使用Apache配置实现CGI服务器 通过按照上述步骤配置Apache服务器,您可以实现一个CGI服务器,从而运行动态内容的脚本。确保安装并启用了Apache服务器,配置了虚拟主机以支持CGI,并创建了正确扩展名的CGI脚本。在本文中,我们将探讨如何配置Apache服务器以支持CGI(公共网关接口)脚本,从而创建一个具有动态内容的服务器。根据您的操作系统,可以使用适当的包管理器或从Apache官方网站下载适用于您的系统的二进制文件。在配置完成后,您可以在指定的目录中创建CGI脚本。在您的Apache配置文件中,您需要为您的虚拟主机配置CGI 阅读详情

相关推荐

【Python深入浅出㉘】探索Python3的CGI编程:开启动态网页的新征程

通用网关接口(Common Gateway Interface,CGI)是一种标准接口,它定义了 Web 服务器与外部应用程序之间的通信方式。在 Web 开发的架构中,Web 服务器主要负责接收客户端(如浏览器)发送的 HTTP 请求,并返回相应的响应。然而,对于一些需要动态生成内容的请求,如处理用户提交的表单数据、查询数据库并返回结果等,单纯的 Web 服务器无法直接完成这些复杂的任务。这时,CGI 就发挥了重要作用,它充当了 Web 服务器与外部应用程序之间的桥梁。

邓邓子的博客 1245

CGI动态页面配置

CGI动态页面 简介 相关模块 相关指令 mod_alias mod_cgi AddHandler Options ScriptAlias CGI(公共网关接口)定义

stonesharp的专栏 1178

CGI动态网页编程

CGI动态网页编程,从入门到精通,十个经典例子让你在学习过程中提升效率,让CGI动态网页编程成为轻松快乐的学习。

嵌入式Web项目(二)——CGI的引入

文章目录静态网页工作原理动态网页工作原理CGI的概念CGI工作原理boa配置静态文件与CGI文件访问路径静态文件CGIPath动态网页以shell语言,实现动态网页案例第一次访问测试第二次测试C语言测试 静态网页工作原理 这里以上一节博客中案例test_01.html文件为例。(类比图中的a.html) 浏览器通过访问我的TCP服务器(Web服务器,boa),请求获得test01_html文件的信息。 服务器(boa)在接收到这个请求以后,就会去解析该请求在我们对应的资源目录文件中去寻找请求文件 改资

m0_56145255的博客 4045

cgi html模板,Perl/CGI 模板

使用模板技术,可以大量节省代码的编写量,提高代码效率,便于调试。一般我们把常用的HTML代码放到后缀为“.html”的文件中作为模板,并将这些模板文件统一放在名为“templates/”的子目录下。然后在所写的Perl/CGI程序中,使用这些HTML模板文件。)另外,在你给模板文件命名时,尽量取些描述性强的名字。通常的命名方法是:下划线后面紧跟程序名,目的是用来区分常规的HTML文件和HTML模板...

weixin_39997089的博客 353

web网页向cgi发送post请求并返回数据_Python简易Web服务器(1)

本文主要是用Python3的http.server实现一个简易的Web服务器,具体的参考可在此查看。该简易Web服务器可以处理GET以及POST请求,具体的代码实现如下所示。from http.server import BaseHTTPRequestHandler, HTTPServer ### 导入必要的模块和依赖 from os import path, system, environ f...

weixin_39882271的博客 454

CGIC简明教程目录(CGI篇)

CGIC简明教程目录(CGI篇) CGIC简明教程目录 本系列的目的是演示如何使用C语言的CGI库“CGIC”完成Web开发的各种要求。       基础知识     * 1: 使用CGIC的基本思路     * 2: 获取Get请求字符串     * 3: 反转义     * 4: 获取请求中的参数值      进阶训练     * 用CGIC实现文件上传 C

乌拉大喵喵 3446

【项目实战】自主实现 HTTP 项目(六)——CGI机制

我们在之前的篇目中讲到了,在我们客户端向服务器发送请求的时候,如果发送的内容是一个目录或者一个普通文件,我们给他们返回的是一个静态的网页。而接下来我们就讲解另一种情况,如果请求资源路径下面是一个可执行文件,那么这个时候就要我们使用(CGI)机制。

2021级大一程序白一枚,记录学习的每一步的脚印 2182

使用ajax+cgi,实现网页如何把数据通过AJAX发给后台CGI和后台CGI如何把数据返回到网页的指定控件显示,小案例

相关说明 操作系统:CentOS7 Web服务器:BOA 语言:HTML+JS+C 演示了网页如何把数据通过AJAX发给后台CGI和后台CGI如何把数据返回到网页的指定控件显示 源码参考:AJAX_CGI BOA的搭建参考:Linux下嵌入式Web服务器BOA和CGI编程开发 小案例实战参考:嵌入式web服务器BOA+CGI+HTML+MySQL项目实战——Linux 源码下载:GitHub 效果...

Love丶伊卡洛斯 4675

常用的4种动态网页技术—CGI、ASP、JSP、PHP

1.CGI      CGI(Common Gateway Interface,公用网关接口)是较早用来建立动态网页的技术。当客户端向Web服务器上指定的CGI程序发出请求时,Web服务器会启动一个新的进程执行某些CGI程序,程序执行后将结果以网页的形式再发送回客户端。      CGI的优点是它可以用很多语言编写,如 C 、C++ 、VB和Perl语言。在语言的选择上有很大的灵活性。

邓俊宥 1万+

Apache 之执行 CGI 脚本(Python 实现)

本文记录了一个搭建 CGI 环境的示例。前文推荐:《Apache 2.4.54 x64 安装及配置》。

Let`s Pythonic 1082

Apache中使用CGI

- #config timefmt="%y年%m月%d日"-->Apache24\cgi-bin,改.cgi也可以。使用Visual Studio 2022。这个目录下的exe文件粘贴到。代码自己搞SSI了可以忽略。

lgq1368853532的博客 660

apache2执行cgi配置

前几天,我按照网上说明,搞了一下cgi。结果如果用shell写cgi,直接在网页上显示文本内容,如果用c语言写,网页下载可执行文件。我试了很多次之后,我开始意识到:可能是apach2的配置出问题,所以不执行cgi。我试了很多次,修改我输入的关键字,结果是我想要的了。但是试了很多次都不行,每个网页都是有问题。我综合他们的方法,终于得到一个可行的方法。如果自己创建的*.sh脚本,那么手动添加可执行权限。七、在index.html里面调用shell的cgi。因为test.cgi是可执行文件,默认有执行权限。

ghomeway的专栏 1042

Nginx + fastCGI 实现动态网页部署

在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。Nginx+CGI处理步骤用户发送HTTP请求到Web服务器Web服务器fork一个CGI子进程,将用户请求交给CGI程序CGI程序把处理结果传送给Web服务器,CGI子进程被销毁Web服务器把结果返回到用户CGI缺点。

new9232的博客 5956

Apachecgi服务配置部署

总的来说,apache 默认支持.cgi的服务,开启支持.cgi服务有两种方式: 1.落霞满天飞 cgi程序不限制部署目录, 可以在web根目录下到处放置。那么apache如何来识别你的服务是cgi的呢? 没错,通过服务的后缀名.cgi 识别。如何配置? 只需要两步: 假设根目录为: DocumentRoot "/var/www" A:则找到以下段,在options后加上ExecC...

marxw520的专栏 471

web编程(一)使用Apache搭建http服务器,实现CGI

专门处理HTTP请求的服务器,也被称为Web服务器。常用的Web服务器有Apache和Nginx,当然几大巨头五联网公司也都有其独自研发的Web服务器,比如阿里巴巴的Tengine。我们使用Apache作为Web服务器,并按照下面5个步骤安装好Apache............

阿乐的博客 1368

配置apache支持cgi

最近在搭建gitweb,需要apache支持perl(支持cgi功能) 网上找了很多方法,很多都失败了,最后总结了一条配置成功的方法: 一、首先已经安装上了apache服务器 二、编辑/etc/apache2/apache2.conf 首先配置apachecgi的支持,加上如下配置: LoadModule cgi_module /usr/lib/apache2/modules/mod_

lyhDream的专栏 5284

CGI入门指南:从原理到实践,探索动态网页的基石

虽然现代Web开发更多采用FastAPI、Django等高级框架,但理解CGI的工作原理仍然重要。请求-响应循环的本质环境变量在Web中的作用服务器与程序的解耦思想。

软件架构师笔记 1015
上一篇: 比较完美地解决了Ubuntu下NVIDIA和Intel双显卡的问题! http://tieba.baidu.com/p/1462926619
下一篇: Webpy + Apache with mod_wsgi on Ubuntu http://webpy.org/cookbook/mod_wsgi-apache-ubuntu
Moonant
博客等级 码龄14年 13粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值