Chinaunix首页 | 论坛 | 博客
  • 博客访问: 742623
  • 博文数量: 141
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(141)

分类: LINUX

2016-03-23 12:08:06

配置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中,示例如下:

点击(此处)折叠或打开

  1. <VirtualHost *:80>
  2.     ServerAdmin webmaster@localhost

  3.     DocumentRoot /var/www
  4.     <Directory />
  5.         Options FollowSymLinks
  6.         AllowOverride None
  7.     </Directory>
  8.     <Directory /var/www/>
  9.         Options Indexes FollowSymLinks MultiViews
  10.         AllowOverride None
  11.         Order allow,deny
  12.         allow from all
  13.     </Directory>

  14.     Scriptalias /cgi-bin/ /var/www/cgi-bin/
  15.     <Directory "/var/www/cgi-bin">
  16.         AllowOverride None
  17.         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
  18.         Order allow,deny
  19.         ALLow from all
  20.         AddHandler cgi-script cgi
  21.     </Directory>

  22.     ErrorLog ${APACHE_LOG_DIR}/error.log

  23.     # Possible values include: debug, info, notice, warn, error, crit,
  24.     # alert, emerg.
  25.     LogLevel warn

  26.     CustomLog ${APACHE_LOG_DIR}/access.log combined

  27.     Alias /doc/ "/usr/share/doc/"
  28.     <Directory "/usr/share/doc/">
  29.         Options Indexes MultiViews FollowSymLinks
  30.         AllowOverride None
  31.         Order deny,allow
  32.         Deny from all
  33.         Allow from 127.0.0.0/255.0.0.0 ::1/128
  34.     </Directory>

  35. </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的文件,内容为:

点击(此处)折叠或打开

  1. #!/bin/bash

  2. echo "SERVER_SOFTWARE :: $SERVER_SOFTWARE" >> /tmp/cgidebug
  3. echo "SERVER_NAME:: $SERVER_NAME" >> /tmp/cgidebug
  4. echo "GATEWAY_INTERFACE:: $GATEWAY_INTERFACE" >> /tmp/cgidebug
  5. echo "SERVER_PROTOCOL:: $SERVER_PROTOCOL" >> /tmp/cgidebug
  6. echo "SERVER_PORT:: $SERVER_PORT" >> /tmp/cgidebug
  7. echo "REQUEST_METHOD:: $REQUEST_METHOD" >> /tmp/cgidebug
  8. echo "PATH_INFO:: $PATH_INFO" >> /tmp/cgidebug
  9. echo "PATH_TRANSLATED:: $PATH_TRANSLATED" >> /tmp/cgidebug
  10. echo "SCRIPT_NAME:: $SCRIPT_NAME" >> /tmp/cgidebug
  11. echo "QUERY_STRING:: $QUERY_STRING" >> /tmp/cgidebug
  12. echo "REMOTE_HOST:: $REMOTE_HOST" >> /tmp/cgidebug
  13. echo "REMOTE_ADDR:: $REMOTE_ADDR" >> /tmp/cgidebug
  14. echo "AUTH_TYPE:: $AUTH_TYPE" >> /tmp/cgidebug
  15. echo "REMOTE_USER:: $REMOTE_USER" >> /tmp/cgidebug
  16. echo "REMOTE_IDENT:: $REMOTE_IDENT" >> /tmp/cgidebug
  17. echo -e "************************$(date) ***********************\r\n" >> /tmp/cgidebug

  18. content_type="text/html"

  19. echo -e "Content-type: $content_type\r\n\r\n"
  20. echo -e "\n"

  21. echo -e " CGI testing \n"
  22. echo -e "

    Hello CGI!

    \n"

  23. echo -e "\n"
3.  给demo.cgi文件附上可执行权限;
4. 浏览器访问 http://[your-ip]/cgi-bin/demo.cgi 则可以显示“Hello CGI!”的页面,同时可以在/tmp/cgidebug文件中记录了cgi的变量和值。

阅读(3740) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~