1、 环境:
操作系统:Linux 3.18.0-kali3-amd64 #1 SMP Debian 3.18.6-1~kali2 x86_64 GNU/Linux
Apache:Apache/2.2.22 (Debian)
perl:v5.14.2 built for x86_64-linux-gnu-thread-multi
注:网上找到的很多文章都说要修改http.conf文件,但我的apache版本可能没有这个文件,于是今天摸索了一下,终于配置好了CGI。
2、 配置Apache
(1)确保有CGI mode,可以找到Apache配置路径,找到mods-available路径下,查看是否有cgi相关的.conf 和.load 文件,
我的配置文件路径在 /etc/apache2/,进入mods-available后发现有cgi.load文件,但没有cgi.conf文件,也许不需要conf文件吧(我这么想的)。
但这个路径下的文件都是apache当前可以使用的mods,二进制共享库位置一般都在/usr/lib/apache2/中,要使某一个模块可以在apache启动时
启动,需要在配置文件路径的mods-enabled路径下添加到mods-available中相关模块文件的软连接(若不对可使用硬链接试试,这里我系统默认
有的)。比如这个cgi模块,在mods-available路径下的文件有cgi.load,则在mods-enabled路径下加入指向此文件的软连接,若还有.conf文件,同
样需要建立链接。
我系统上cgi.load文件的内容是:
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so
(2)在mods-available路径下找到mime模块的配置文件,我系统中的配置文件是mime.conf,其内容是一个由xml括起来的配置内容:
<IfModule mod_mime.c>
...
</IfModule>
在中间加上一行:
AddHandler cgi-script .cgi # 若扩展名有多种,可以用空格分隔开,依次写出来,如:.pl .sh .py
(3)将使用CGI的站点配置文件加上CGI执行标记:
我系统中的apache对站点配置也使用像模块管理的方式,即有一个sites-available和sites-enabled路径,其中available中是所有站点的配置文件,enabled
中是可以允许apache服务的站点。我使用的是默认的default站点,也即是金典的“It Works!”,配置文件中已经写了一个可以执行的cgi路径:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
其中的ScriptAlias是将URL的/cgi-bin/路径映射到本机的/usr/lib/cgi-bin/路径,之后的Directory 就是配置此路径的节点,在Options 这一项必须添加+ExecCGI
标记。
(4)创建cgi脚本,运行:
我们可以在本地的/usr/lib/cgi-bin/路径下开始写所要运行的cgi脚本了:
#!/usr/bin/perl
use strict;
use warnings;
print <<END
Content-type: text/html\n\n
<html>
<body>
<div>
<a>shit!CGI...</a>
</div>
</body>
</html>
END
注意:其中第一行打印Content-type必须写出来,不然会出现500错误状态码:Internal Server Error! 以下几点也很重要,否则可能同样产生此错误。a) 将cgi文件的权限掩码至少改成可读,可执行权限,即使用chmod 555 cgi.cgi,可使用ls -lah查看。
b) 脚本第一行的shebang行(#!/usr/bin/perl)必须写出。
重启apache: service apache2 restart
最后运行时在浏览器URL栏写上:http://localhost/cgi-bin/cgi.cgi即可。
Apache Tutorial: http://httpd.apache.org/docs/2.2/