CGI动态页面html
相关模块 | 相关指令 |
---|---|
CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,一般是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和经常使用的方法。本文将对如何在Apache web服务器上创建CGI以及如何编写CGI程序进行介绍。python
配置Apache以容许CGIlinux
要让CGI程序能正常运做,必须配置Apache以容许CGI的执行,web
第一步:配置Apache(httpd.conf)加载cgi模块,详细参考 Apache不从新编译,利用apxs工具给Apache添加模块,如cgi模块shell
第二步:配置Apache(httpd.conf)设置cgi目录,以下方法之一:apache
方法一:ScriptAlias浏览器
ScriptAlias指令使Apache容许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中全部的文件都是CGI程序并试图运行它。安全
ScriptAlias指令形如:bash
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/服务器
完整配置参考以下:
<IfModule alias_module> ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" </IfModule> <Directory "/usr/local/apache2/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all #千万别忘了这个配置 </Directory>
若是Apache被安装到默认位置,默认的配置文件httpd.conf中就会有上述配置。ScriptAlias与Alias指令很是类似,都是定义了映射到一个特定目录的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在任意目录执行须要两个步骤:
#第一步:指定特定文件后缀为CGI文件(即,告诉服务器哪些文件是CGI文件)。
有2种方法:方法一是定义MIME类型为application/x-httpd-cgi,方法二是使用 AddHandler 或 SetHandler 指令
例如,下面的AddHandler指令告诉服务器全部带有cgi或pl后缀的文件是CGI程序。(添加到配置文件的最后面便可)
AddType application/x-httpd-cgi .cgi .pl #方法一 AddHandler cgi-script .cgi .pl #方法二
#第二步:设置CGI的目录属性,必须在Options指令中启用ExecCGI选项。
能够在主配置文件中,使用Options指令显式地容许特定目录中CGI的执行:
<Directory "/usr/local/apache2/cgi-bin"> Options ExecCGI AllowOverride None Order allow,deny Allow from all </Directory>
方法三:.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>
#编写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. 。虽然并不怎么激动人心,可是一旦这个程序能正常运行,那么就可能运行其余任何程序。
附:
(1)Shell脚本cgi程序
#!/bin/bash echo "Content-type: text/html" echo # 注意,这行不能少 echo "Hello, Shell.cgi"
(2)Python脚本cgi程序
#!/usr/bin/python print("Content-type: text/html\n") // 末尾的换行符不能少 print("Hello, Python.cgi")
(3)使用任何语言编写均可以,只要程序能够正常执行,Apache就能够把输出原封不动的发给浏览器。
更详细、更深刻的教程,请看官方教程:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html