配置apache以允许cgi
要让cgi程序能正常运作,必须配置apache以允许cgi的执行,其方法有多种:
scriptalias
scriptalias指令使apache允许执行一个特定目录中的cgi程序。当客户端请求此特定目录中的资源时,apache假定其中文件都是cgi程序并试图运行。
scriptalias指令形如:
scriptalias /cgi-bin/ /var/www/cgi-bin/
如果apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。scriptalias指令定义了映射到一个特定目录的url前缀,与alias指令非常相似,两者一般都用于指定位于documentroot目录以外的目录,其区别是scriptalias又多了一层含义,即其url前缀中任何文件都被视为cgi程序。所以,上述例子会指示apache,/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为cgi程序。另外,该配置可能在httpd.conf中也可以直接配置在sites-available/default中,示例如下:
-
<virtualhost *:80>
-
serveradmin webmaster@localhost
-
-
documentroot /var/www
-
<directory />
-
options followsymlinks
-
allowoverride none
-
</directory>
-
<directory /var/www/>
-
options indexes followsymlinks multiviews
-
allowoverride none
-
order allow,deny
-
allow from all
-
</directory>
-
-
scriptalias /cgi-bin/ /var/www/cgi-bin/
-
<directory "/var/www/cgi-bin">
-
allowoverride none
-
options execcgi -multiviews symlinksifownermatch
-
order allow,deny
-
allow from all
-
addhandler cgi-script cgi
-
</directory>
-
-
errorlog ${apache_log_dir}/error.log
-
-
# possible values include: debug, info, notice, warn, error, crit,
-
# alert, emerg.
-
loglevel warn
-
-
customlog ${apache_log_dir}/access.log combined
-
-
alias /doc/ "/usr/share/doc/"
-
<directory "/usr/share/doc/">
-
options indexes multiviews followsymlinks
-
allowoverride none
-
order deny,allow
-
deny from all
-
allow from 127.0.0.0/255.0.0.0 ::1/128
-
</directory>
-
-
</virtualhost>
举例,如果有url为的请求,apache会试图执行/var/www/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则apache返回一个出错消息。
scriptalias目录以外的cgi
由于安全原因,cgi程序通常被限制在scriptalias指定的目录中,如此,管理员就可以严格地控制谁可以使用cgi程序。但是,如果采取了恰当的安全方法措施,则没有理由不允许其他目录中的cgi程序运行。比如,你可能希望用户在userdir指定的宿主目录中存放页面,而他们有自己的cgi程序,但无权存取cgi-bin目录,这样,就产生了运行其他目录中cgi程序的需求。
用options显式地允许cgi的执行
可以在主服务器配置文件中,使用options指令显式地允许特定目录中cgi的执行:
options execcgi
上述指令使apache允许cgi文件的执行。另外,还必须告诉服务器哪些文件是cgi文件。下面的addhandler指令告诉服务器所有带有cgi或pl后缀的文件是cgi程序:
addhandler cgi-script .cgi .pl
应用举例:
1. 检查/var/www目录下是否存在cgi-bin目录,如果没有则创建之;
2. 在该目录下穿件一个demo.cgi的文件,内容为:
-
#!/bin/bash
-
-
echo "server_software :: $server_software" >> /tmp/cgidebug
-
echo "server_name:: $server_name" >> /tmp/cgidebug
-
echo "gateway_interface:: $gateway_interface" >> /tmp/cgidebug
-
echo "server_protocol:: $server_protocol" >> /tmp/cgidebug
-
echo "server_port:: $server_port" >> /tmp/cgidebug
-
echo "request_method:: $request_method" >> /tmp/cgidebug
-
echo "path_info:: $path_info" >> /tmp/cgidebug
-
echo "path_translated:: $path_translated" >> /tmp/cgidebug
-
echo "script_name:: $script_name" >> /tmp/cgidebug
-
echo "query_string:: $query_string" >> /tmp/cgidebug
-
echo "remote_host:: $remote_host" >> /tmp/cgidebug
-
echo "remote_addr:: $remote_addr" >> /tmp/cgidebug
-
echo "auth_type:: $auth_type" >> /tmp/cgidebug
-
echo "remote_user:: $remote_user" >> /tmp/cgidebug
-
echo "remote_ident:: $remote_ident" >> /tmp/cgidebug
-
echo -e "************************$(date) ***********************\r\n" >> /tmp/cgidebug
-
-
content_type="text/html"
-
-
echo -e "content-type: $content_type\r\n\r\n"
-
echo -e "\n"
-
-
echo -e "
cgi testing
\n"
-
echo -e "
cgi 入门 -凯发app官方网站
\n"
-
echo -e "\n"
3. 给demo.cgi文件附上可执行权限;
4. 浏览器访问 http://[your-ip]/cgi-bin/demo.cgi 则可以显示“hello cgi!”的页面,同时可以在/tmp/cgidebug文件中记录了cgi的变量和值。
阅读(3806) | 评论(0) | 转发(0) |