配置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 "
Hello CGI!
\n"
-
echo -e "\n"
3. 给demo.cgi文件附上可执行权限;
4. 浏览器访问 http://[your-ip]/cgi-bin/demo.cgi 则可以显示“Hello CGI!”的页面,同时可以在/tmp/cgidebug文件中记录了cgi的变量和值。
阅读(3849) | 评论(0) | 转发(0) |